栈是限定仅在表尾进行插入和删除的线性表,对表尾端称做栈顶,表头端称做栈底,不含元素的空表成为空栈,栈的修改原则是后进先出。bash
操做相对简单,因为在初始化时限定了存储空间,因此空间局限性大。markdown
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status; typedef int SElemType; /* SElemType类型根据实际状况而定,这里假设为int */ /* 顺序栈结构 */ typedef struct { SElemType data[MAXSIZE]; int top; /* 用于栈顶指针 */ }SqStack; 复制代码
//1构建一个空栈 Status InitStack(SqStack *S){ S->top = -1; return OK; } //2 将栈置空 Status ClearStack(SqStack *S){ S->top = -1; return OK; } //3 判断顺序栈是否为空; Status StackEmpty(SqStack S){ if (S.top == -1){ return TRUE; }else{ return FALSE; } } //4 返回栈的长度 int StackLength(SqStack S){ return S.top + 1; } //5 获取栈顶 Status GetTop(SqStack S,SElemType *e){ if (S.top == -1){ return ERROR; }else{ *e = S.data[S.top]; } return OK; } //6 插入元素e为新栈顶元素 Status PushData(SqStack *S, SElemType e){ if (S->top == MAXSIZE -1) { return ERROR; } S->top ++; S->data[S->top] = e; return OK; } //7 删除S栈顶元素,而且用e带回 Status Pop(SqStack *S,SElemType *e){ if (S->top == -1) { return ERROR; } *e = S->data[S->top]; S->top--; return OK; } int main(int argc, const char * argv[]) { SqStack S; int e; if (InitStack(&S) == OK) { for (int j = 1 ; j < 10; j++) { PushData(&S, j); } } printf("顺序栈中元素为:\n"); StackTraverse(S); Pop(&S, &e); printf("弹出栈顶元素为: %d\n",e); StackTraverse(S); printf("是否为空栈:%d\n",StackEmpty(S)); GetTop(S, &e); printf("栈顶元素:%d \n栈长度:%d\n",e,StackLength(S)); ClearStack(&S); printf("是否已经清空栈 %d, 栈长度为:%d\n",StackEmpty(S),StackLength(S)); return 0; } 复制代码
空间大小不固定,可扩展性强spa
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status; typedef int SElemType; /* SElemType类型根据实际状况而定,这里假设为int */ /* 链栈结构 */ typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct { LinkStackPtr top; int count; }LinkStack; 复制代码
/*1 构造一个空栈S */ Status InitStack(LinkStack *S) { S->top=NULL; S->count=0; return OK; } /*2 把链栈S置为空栈*/ Status ClearStack(LinkStack *S){ LinkStackPtr p,q; p = S->top; while (p) { q = p; p = p->next; free(q); } S->count = 0; return OK; } /*3 判断是否为空栈*/ Status StackEmpty(LinkStack S){ if (S.count == 0) return TRUE; else return FALSE; } /*4 返回S的元素个数,即栈的长度*/ int StackLength(LinkStack S){ return S.count; } /*5 若链栈S不为空,则用e返回栈顶元素,并返回OK ,不然返回ERROR*/ Status GetTop(LinkStack S,SElemType *e){ if(S.top == NULL) return ERROR; else *e = S.top->data; return OK; } /*6 插入元素e到链栈S (成为栈顶新元素)*/ Status Push(LinkStack *S, SElemType e){ LinkStackPtr temp = (LinkStackPtr)malloc(sizeof(StackNode)); temp->data = e; temp->next = S->top; S->top = temp; S->count++; return OK; } /*7 若栈不为空,则删除S的栈顶元素,用e返回其值.并返回OK,不然返回ERROR*/ Status Pop(LinkStack *S,SElemType *e){ LinkStackPtr p; if (StackEmpty(*S)) { return ERROR; } *e = S->top->data; p = S->top; S->top= S->top->next; free(p); S->count--; return OK; } int main(int argc, const char * argv[]) { int j; LinkStack s; int e; if(InitStack(&s)==OK) for(j=1;j<=10;j++) Push(&s,j); printf("栈中元素依次为:"); StackTraverse(s); Pop(&s,&e); printf("弹出的栈顶元素 e=%d\n",e); StackTraverse(s); printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s)); GetTop(s,&e); printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s)); ClearStack(&s); printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s)); return 0; } 复制代码