xiaoxiao2023-11-18  157

    栈:是限定仅在表尾进行插入和删除操作的线性表。(又称“后进先出”线性表) 栈顶:允许插入和删除的一端。 栈底:另一端。 空栈:不含任何数据元素的栈。

    顺序存储结构:

    栈的定义 typedef int SElemType; typedef struct { SElemType data[MAXSIZE]; int top; /*用于栈顶指针*/ }sqstack; 创建空栈 /*创建栈*/ sqstack *sqstack_create( ) { sqstack *S; S=(sqstack *)malloc(sizeof(*S)); S->top=-1; return S; } 进栈 int push(sqstack *S,SElemType e) { if(S->top==MAXSIZE-1) /*栈满*/ { return -1; } S->top++; /*栈顶指针+1*/ S->data[S->top]=e; /*将新插入元素赋给栈顶空间*/ return 0; } 出栈 int pop(sqstack *S,SElemType *e) { if(S->top==-1) { return -1; } *e=S->data[S->top]; /*用e返回其将要删除的栈顶元素*/ S->top--; return 0; /*栈顶指针-1*/ }

    链式存储结构:

    链栈的定义 typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct LinkStack { LinkStackptr top; int count; }LinkStack; 创建空栈 int InitStack(LInkStack *S) { S=(LinkStack *)malloc(sizeof(LinkStack)); S->top=NULL; S->count=0; } 进栈 int push(LinkStack * ,S,SElemType e) { LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode)); s->data=e; s->next=S->top; S->top=s; S->count++; return 0; } 出栈 int pop(LinkStack *S,SElemType *e) { LinkStackPtr p; if(StackEmpty(*S)) return -1; *e=S->top->data; p=S->top; S->top=S->top->next; free(p); S->count--; return 0; }

    栈的应用:

    递归 在前行阶段,对于每一层递归,函数的局部变量、参数值以及返回地址都被压入栈中。 在退回阶段,位于栈顶的局部变量、参数值和返回地址被弹出,用于返回调用层次中执行代码的其余部分,也就是恢复了调用状态。括号匹配后缀表达式求值**
    最新回复(0)