顺序栈即数组型的栈。什么是栈呢?简单来说就像一个刚好装的下乒乓球大小的球筒,假设不能暴力打开球筒且只有一端有出口,那你放入或取出里面的球的操作都只能在一端进行,并且把球放进去或取出来都是由顺序决定的,也就是说你只能从里面没有球或空间足够的时候把球放进去,然后需要的时候再从最外面的那个球拿出一个才能再拿里面的,这就是后进先出(LILO - last in last out),栈的原理就是这么回事。其本质基本上就是一个顺序储存结构,也就是一个线性表,所以栈是前驱后继的关系的线性结构。人们口中常说的堆栈一般就是指栈,而不是堆和栈。
栈的应用也很重要,比如做递归的时候就是一个栈的原理、符号的匹配问题、后缀表达式等等。
code:
#include<stdio.h> #include<stdlib.h> #include<conio.h> #define EmptyToStack -1 #define MAXSIZE 500 #define TRUE 1 #define FALSE 0; typedef int ElemType; typedef int Status; typedef struct { ElemType * data; int top; }Stack; Stack * CreateStack(); Status IsEmpty(); Status IsFull(); Status Push(); Status Pop(); int Top(); int StackLength(); Stack * CreateStack(void) { Stack * S; S = (Stack *)malloc(sizeof(Stack)); S -> data = (ElemType *)malloc(sizeof(ElemType)); S -> top = EmptyToStack; return S; } Status IsEmpty(Stack * S) { return S -> top == EmptyToStack; } Status IsFull(Stack * S) { return S -> top == MAXSIZE; } Status Push(Stack * S, ElemType Elem) { if(IsFull(S)) return FALSE; S -> data[++ S -> top] = Elem; return TRUE; } Status Pop(Stack * S) { if(IsEmpty(S)) return FALSE; S -> top --; return TRUE; } int Top(Stack * S) { return S -> top; } int StackLength(Stack * S) { return S -> top + 1; } int main(void) { ElemType e; Stack * p; char c; int i; p = CreateStack(); puts("1) 进栈 2) 出栈"); puts("3) 遍历栈 4) 返回栈顶元素"); puts("5) 清空栈 6) 当前栈的长度"); puts("q) 退出"); while((c = getch()) != 'q') { if(c == '1') { puts("请输入数据:"); scanf("%d",&e); Push(p, e); } if(c == '2') { puts("当前栈顶元素为:"); printf("%d ",p -> data[Top(p)]); Pop(p); puts("当前栈顶元素为:"); printf("%d ",p -> data[Top(p)]); } if(c == '3') { puts("显示数据:"); for(i = Top(p); i > EmptyToStack; i--) { printf("%d -> ",p -> data[i]); } printf("NULL "); } if(c == '4') { puts("当前栈顶元素为:"); printf("%d ",p -> data[Top(p)]); } if(c == '5') { do Pop(p); while(p -> top != EmptyToStack); if(!IsEmpty(p)) puts("ERROR! "); } if(c == '6') { printf("当前栈长: %d ",StackLength(p)); } } return 0; }