-
栈概念
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
-
栈特点
运算受限的线性表:表现为栈顶入栈、栈顶出栈,先进后出 -
栈的顺序存储实现
- 顺序栈示意图
- 初始化
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 10 typedef int ElemType; typedef int Status; typedef struct{ ElemType *data; int top; //用来记录栈顶位置 }Stack; Status creatStack(Stack *S){ if(S->data == NULL){ S->data = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE); if(!S->data) exit(0); S->top = -1; //默认当top=-1时为空栈 } return OK; }- 入栈
//入栈 //1.先判断当前栈是否已满(满栈不能入栈) //2.赋值data[top+1] = data //3.top+1 Status pushData(Stack *S,ElemType data){ if(S->data == NULL) return ERROR; if(S->top + 1 > MAXSIZE -1) return ERROR; S->data[S->top + 1] = data; S->top ++; return OK; }- 出栈
//出栈 //只需要将top减一即可 Status popData(Stack *S){ if(S->data == NULL) return ERROR; if(S->top == -1) return ERROR; S->top --; return OK; }- 置空、获取栈长度、遍历
//清空 只需将top置成-1即可 Status cleanStack(Stack *S){ if(S->data == NULL) return ERROR; S->top = -1; return OK; } //获取栈的长度 Status getLength(Stack S,int *length){ if(S.data == NULL) return ERROR; *length = S.top + 1; return OK; } //遍历栈 void traverseStack(Stack S){ for(int i = 0; i <= S.top; i ++){ printf("%d ",S.data[i]); } printf("\n"); } - 顺序栈示意图
-
栈的链式存储实现
- 链式栈示意图
- 初始化
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; typedef struct StackNode{ ElemType data; struct StackNode *next; }StackNode,*StackPtr; typedef struct { StackPtr top; int length; } Stack; //初始化 Status creatStack(Stack *S){ S->top = NULL; S->length = 0; return OK; }- 入栈
//入栈 Status pushData(Stack *S, ElemType data){ if(!S) return ERROR; StackPtr temp = (StackPtr)malloc(sizeof(StackPtr)); if(!temp) exit(0); temp->next = S->top; temp->data = data; S->top = temp; S->length ++; return OK; }- 出栈
//出栈 Status popData(Stack *S){ if(!S) return ERROR; if(S->length == 0) return OK; StackPtr temp = S->top; S->top = temp->next; S->length --; free(temp); return OK; }- 遍历
//遍历 void traverse(Stack S){ while (S.top) { printf("%d ",S.top->data); S.top = S.top->next; } printf("\n"); } - 链式栈示意图