「C言語」配列リストと接続リストを使用してスタックを実装


コンセプト

  • 線形資料構造
  • 初めて駅を出て、後入駅
  • タワー(上部):最近スタックに挿入されたデータ
  • えんざん


    プッシュ

  • 資料
  • を挿入
  • オーバーフロー現象を考慮

    pop(Pop)

  • データを消去
  • 不足(Underflow)現象を考慮

    ピーク

  • スタック上部要素(top)は
  • を返します.

    インプリメンテーション


    シナリオ・リスト


  • 指定最大サイズ
  • アレイ
  • を追加順に挿入する
    👉 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]);
    }
    🔗 配列リストスタック完全コード

    接続リスト


  • 最大寸法
  • を指定する必要はありません.
  • スタックは、前のノードを指すtopノードポインタを有する
    最初の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);
    }
    🔗 接続リストスタックの完全なコード