其他分享
首页 > 其他分享> > 链栈

链栈

作者:互联网

栈,是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。对于栈的修改要按照先进后出的原则进行,因此,栈又被称为后进先出(LIFO)的线性表。

链栈,用链表作为存储结构的栈 —— 链表的头指针就是栈顶指针。

基本方法有:

  1. 初始化:创建一个空栈。
  2. 判断栈是否为空:如果栈为空,返回“真”,否则返回“假”。
  3. 入栈:将元素x加入栈顶,并更新栈顶指针。
  4. 出栈:将栈顶元素删除,并更新栈顶指针。可以返回栈顶元素。
  5. 读取栈顶元素:返回栈顶元素,但不修改栈顶指针。

C语言实现

#define TRUE 1
#define FALSE 0
#define ERROR -1
#define NULL -2
typedef int bool;
typedef int ElementType;

Stack CreateStack();
bool IsEmpty(Stack S);
bool Push(Stack S, ElementType X);
ElementType Pop(Stack S);

typedef struct SNode *PtrToSNode;
struct SNode {
    ElementType Data;
    PtrToSNode Next;
};
typedef PtrToSNode Stack;

Stack CreateStack( ) 
{ /* 构建一个堆栈的头结点,返回该结点指针 */
    Stack S;
 
    S = (Stack)malloc(sizeof(struct SNode));
    S->Next = NULL;
    return S;
}
 
bool IsEmpty ( Stack S )
{ /* 判断堆栈S是否为空,若是返回true;否则返回false */
    return ( S->Next == NULL );
}
 
bool Push( Stack S, ElementType X )
{ /* 将元素X压入堆栈S */
    PtrToSNode TmpCell;
 
    TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));
    TmpCell->Data = X;
    TmpCell->Next = S->Next;
    S->Next = TmpCell;
    return TRUE;
}
 
ElementType Pop( Stack S )  
{ /* 删除并返回堆栈S的栈顶元素 */
    PtrToSNode FirstCell;
    ElementType TopElem;
 
    if( IsEmpty(S) ) {
        printf("堆栈空"); 
        return ERROR;
    }
    else {
        FirstCell = S->Next; 
        TopElem = FirstCell->Data;
        S->Next = FirstCell->Next;
        free(FirstCell);
        return TopElem;
    }
}

应用

  1. 表达式求值
  2. 括号匹配
  3. 将递归过程转变为非递归过程

标签:return,栈顶,Next,链栈,PtrToSNode,ElementType,Stack
来源: https://www.cnblogs.com/vicky2021/p/16036670.html