「C言語」配列リストと接続リストを使用してスタックを実装
コンセプト
えんざん
プッシュ
pop(Pop)
ピーク
インプリメンテーション
シナリオ・リスト
👉 topは
currentElementCount -1
第構造体と関数のプロトタイプ
typedef struct ArrayStackNodeType {
char data;
} ArrayStackNode;
typedef struct ArrayStackType {
int maxElementCount;
int currentElementCount;
ArrayStackNode *pElement;
} ArrayStack;
ArrayStack* createArrayStack(int maxElementCount); // 스택 생성
int pushAS(ArrayStack* pStack, ArrayStackNode element); // 노드 추가
ArrayStackNode* popAS(ArrayStack* pStack); // 노드 제거
ArrayStackNode* peekAS(ArrayStack* pStack); // 노드 반환
void deleteArrayStack(ArrayStack** pStack); // 스택 제거
int isArrayStackFull(ArrayStack* pStack); // 스택이 찼는지 확인
int isArrayStackEmpty(ArrayStack* pStack); // 스택이 비었는지 확인
void displayArrayStack(ArrayStack* pStack);
create
ArrayStack* createArrayStack(int maxElementCount) // 스택 생성
{
ArrayStack *stack;
if (maxElementCount < 0)
return (NULL);
stack = (ArrayStack*)malloc(sizeof(ArrayStack));
if (stack == NULL)
return (NULL);
stack->maxElementCount = maxElementCount;
stack->currentElementCount = 0;
stack->pElement = (ArrayStackNode*)malloc(sizeof(ArrayStackNode) * maxElementCount);
if (stack->pElement == NULL)
{
free(stack);
stack = NULL;
return (NULL);
}
return (stack);
}
push
int pushAS(ArrayStack* pStack, ArrayStackNode element) // 노드 추가
{
if (pStack == NULL)
return (FALSE);
if (isArrayStackFull(pStack))
return (FALSE);
pStack->pElement[pStack->currentElementCount] = element;
pStack->currentElementCount++;
return (TRUE);
}
pop
ArrayStackNode* popAS(ArrayStack* pStack) // 노드 제거
{
ArrayStackNode *new;
ArrayStackNode *element;
element = peekAS(pStack);
if (element == NULL)
return (NULL);
new = (ArrayStackNode *)malloc(sizeof(ArrayStackNode));
if (new == NULL)
return (NULL);
*new = *element;
pStack->currentElementCount--;
return (new);
}
peek
ArrayStackNode* peekAS(ArrayStack* pStack) // 노드 반환
{
if (pStack == NULL)
return (NULL);
if (isArrayStackEmpty(pStack))
return (NULL);
return (&pStack->pElement[pStack->currentElementCount - 1]);
}
🔗 配列リストスタック完全コード 接続リスト
最初のpushノードはNULL
構造体と関数のプロトタイプ
typedef struct StackNodeType
{
char data;
struct StackNodeType* pLink;
} StackNode;
typedef struct LinkedStackType
{
int currentElementCount;
StackNode* pTopElement;
} LinkedStack;
LinkedStack* createLinkedStack(); // 스택 생성
int pushLS(LinkedStack* pStack, StackNode element); // 노드 추가
StackNode* popLS(LinkedStack* pStack); // 노드 제거
StackNode* peekLS(LinkedStack* pStack); // 노드 반환
void deleteLinkedStack(LinkedStack** pStack); // 스택 제거
int isLinkedStackEmpty(LinkedStack* pStack); // 스택이 비었는지 확인
void displayLinkedStack(LinkedStack* pStack);
create
LinkedStack* createLinkedStack() // 스택 생성
{
LinkedStack *stack;
stack = (LinkedStack *)malloc(sizeof(LinkedStack));
if (stack == NULL)
return (NULL);
stack->currentElementCount = 0;
stack->pTopElement = NULL;
return (stack);
}
push
int pushLS(LinkedStack* pStack, StackNode element) // 노드 추가
{
StackNode *new;
StackNode *prev;
if (pStack == NULL)
return (FALSE);
new = (StackNode *)malloc(sizeof(StackNode));
if (new == NULL)
return (FALSE);
*new = element;
prev = peekLS(pStack);
new->pLink = prev;
pStack->pTopElement = new;
pStack->currentElementCount++;
return (TRUE);
}
pop
StackNode* popLS(LinkedStack* pStack) // 노드 제거
{
StackNode *element;
element = peekLS(pStack);
if (element == NULL)
return (NULL);
if (pStack->currentElementCount == 1)
pStack->pTopElement = NULL;
else
pStack->pTopElement = element->pLink;
pStack->currentElementCount--;
return (element);
}
peek
StackNode* peekLS(LinkedStack* pStack) // 노드 반환
{
if (pStack == NULL)
return (NULL);
if (isLinkedStackEmpty(pStack))
return (NULL);
return (pStack->pTopElement);
}
🔗 接続リストスタックの完全なコードReference
この問題について(「C言語」配列リストと接続リストを使用してスタックを実装), 我々は、より多くの情報をここで見つけました https://velog.io/@chez_bono/C언어-배열-리스트와-연결-리스트로-스택-Stack-구현テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol