一、栈的顺序储存结构
#include <stdlib.h> #include <stdio.h> #define MaxSize 10 //顺序栈的抽象数据类型 typedef struct { int data[MaxSize]; //存放栈中的数据元素 int top; //栈顶指针 }SqStack; //顺序栈类型 //初始化栈 void InitStack(SqStack *&s) { s = (SqStack*)malloc(sizeof(SqStack)); //分配一个顺序栈空间,首地址存放在s中 s -> top = -1; //栈顶指针置为-1 } //销毁栈 void DestroyStack(SqStack *&s) { free(s); } //判断栈是否为空 bool StackEmpty(SqStack *s) { if (s->top == -1) printf("这是一个空栈\n"); else printf("这不是空栈\n"); return (s->top == -1); //该运算实际上用于判断条件s->top = -1是否成立 } //进栈->该算法的执行过程是,在栈不满的情况下,先将栈顶指针加1,然后插入元素 bool Push(SqStack *&s, int e) { if (s->top == MaxSize - 1) return false; s->top++; s->data[s->top] = e; return true; } //出栈->该算法的执行过程是,在栈不为空的情况下先将栈顶元素赋给e,然后将栈顶指针减1 bool Pop(SqStack *&s, int &e) { if (s->top == -1) return false; e = s->data[s->top]; s->top--; return true; } //取栈顶元素->该算法的执行过程是在栈不为空的情况下将栈顶元素赋给e,并返回真,否则返回假 bool GetTop(SqStack* s, int &e) { if (s->top == -1) return false; e = s->data[s->top]; return true; } int main() { SqStack *s; s = (SqStack*)malloc(sizeof(SqStack)); InitStack(s); for (int i = 0; i < 10; i++) { Push(s, i); } StackEmpty(s); int e; GetTop(s, e); printf("e=%d\n",e); int a[10]; for (int i = 0; i < 10; i++) { Pop(s, a[i]); } StackEmpty(s); return 0; }二、栈的链式储存结构
规定:链栈的所有操作都是在单链表的表头进行的,因为给定链栈后,已知头结点地址,在其后面插入一个新节点和删除首节点都比较方便。
#include <stdlib.h> #include <stdio.h> #define MaxSize 10 //顺序栈的抽象数据类型 typedef struct linknode { int data; struct linknode* next; }LinkStack; //初始化栈 void InitStack(LinkStack* &s) { s = (LinkStack*)malloc(sizeof(LinkStack)); s->next = NULL; //创建空链栈;实际上就是创建头节点 } //销毁栈 void DestroyStack(LinkStack *&s) { LinkStack* pre = s, *p = s->next; //和销毁单链表的算法完全相同 while (p != NULL) { free(pre); pre = p; p = pre->next; } free(pre); } //判断栈是否为空 bool StackEmpty(LinkStack *s) { if (s->next == NULL) printf("这是一个空栈\n"); else printf("这不是空栈\n"); return (s->next == NULL); //该运算实际上用于判断条件s->next = NULL是否成立 } //进栈 void Push(LinkStack *&s, int e) { LinkStack* p; p = (LinkStack*)malloc(sizeof(LinkStack)); //新建节点 p->data = e; //存放元素 p->next = s->next; //将p结点插入作为首节点 s->next = p; } //出栈 bool Pop(LinkStack *&s, int &e) { LinkStack* p; p = (LinkStack*)malloc(sizeof(LinkStack)); if (s->next == NULL) return false; p = s->next; //p指向首节点位置 p->data = e; //提取首节点值 s->next = p->next; //删除首节点 free(p); //释放被删除节点的储存空间 return true; } //取栈顶元素 bool Getnext(LinkStack* s, int &e) { if (s->next == NULL) return false; e = s->next->data; return true; } int main() { LinkStack *s; s = (LinkStack*)malloc(sizeof(LinkStack)); InitStack(s); StackEmpty(s); for (int i = 0; i < 10; i++) { Push(s, i); } StackEmpty(s); int e; Getnext(s, e); printf("e=%d\n", e); int a[10]; for (int i = 0; i < 10; i++) { Pop(s, a[i]); } StackEmpty(s); return 0; }这是两种基本栈的大致定义,基于以上方法,在后续文章整理一下应用实例吧。