一、废话不多说,直接看代码
#include <iostream> using namespace std; // 定义栈中的节点 typedef struct node { int data; // 栈中节点的数据域 node *next; // 栈中节点指针 }node; // 定义管理栈的结构体 typedef struct linkStack { int size; // 栈的容量 node *top; // 栈顶指针 }linkStack; // 生成一个管理栈的节点 linkStack *initStack(void) { linkStack *s = new linkStack; if(!s) { cout << "动态分配内存空间失败\n"; return NULL; } s->size = 0; s->top = NULL; return s; } // 生成一个栈中节点 node *initNode(void) { node *p = new node; if(!p) { cout << "动态分配内存空间失败\n"; return NULL; } p->data = 0; p->next = NULL; return p; } // 压栈 bool push(linkStack *s, node *p) { if(!s || !p) { return false; } p->next = s->top; // 把新的栈节点插入到栈顶 s->top = p; // 修改栈顶指针 s->size++; // 修改栈的容量 return true; } // 出栈 bool pop(linkStack *s, int *data) { if(!s || !s->size) { return false; } node *tmp = s->top; // 临时保存栈顶指针 *data = tmp->data; // 取出栈顶元素 s->top = tmp->next; // 修改栈顶指针 s->size--; // 修改栈的容量 delete tmp; return true; } // 取栈顶元素 bool getTop(linkStack *s, int *data) { if(!s || !s->size) { return false; } *data = s->top->data; // 取栈顶元素 return true; } // 判断是否为空栈 int isEmpty(linkStack *s) { if(!s) { return -1; } return s->size > 0; } // 获取栈的容量 int stackLength(linkStack *s) { if(!s) { return -1; } return s->size; } // 清空栈 bool clearStack(linkStack *s) { if(!s) { return false; } node *tmp; for(int i = 0; i < s->size; i++) { tmp = s->top; s->top = tmp->next; delete tmp; } s->top = NULL; s->size = 0; return true; } // 销毁栈 bool destroyStack(linkStack *s) { if(clearStack(s)) { delete s; return true; } return false; } int main() { int i, data; node *p; linkStack *s; s = initStack(); if(!s) { cout << "初始化栈管理节点失败\n"; return -1; } while(1) { cout << "请选择你的操作, 1.压栈 2.出栈 3.栈的容量 4.判空 5.清空栈 6.销毁栈 7.退出 "; cin >> i; switch(i) { case 1: p = initNode(); if(!p) { cout << "初始化栈中节点失败\n"; break; } cout << "请输入压栈数据:"; cin >> p->data; if(push(s, p)) { cout << "压栈成功\n"; } else { cout << "压栈失败\n"; } break; case 2: if(pop(s, &data)) { cout << "栈顶元素:" << data << endl; } else { cout << "空栈\n"; } break; case 3: data = stackLength(s); if(data > -1) { cout << "栈的容量:" << data << endl; } else { cout << "栈不存在\n"; } break; case 4: data = isEmpty(s); if(data > 0) { cout << "栈非空\n"; } else if(data == 0) { cout << "空栈\n"; } else if(data == -1) { cout << "栈不存在\n"; } break; case 5: if(clearStack(s)) { cout << "清空成功\n"; } else { cout << "栈不存在\n"; } break; case 6: if(destroyStack(s)) { s = NULL; cout << "销毁成功\n"; } else { cout << "栈不存在\n"; } break; } if(i == 7) { cout << "你已退出\n"; break; } } return 0; }
二、简单分析
如果你学过数据结构,不是很理解栈,看这个会对你有很大的帮助,代码里的注释到位,易错点指出,认真看基本能看懂。难点就是如何定义一个栈,有很多种方法,一种像这里的,先定义一个管理的结构体,然后在用这个管理的结构体来管理栈中的节点,操作方便;另外一种是不定义管理的结构体,直接用栈中节点来自我管理,操作有点难理解。
三、小小总结
别顾着看,自己动手默写一下,看看会多少,下期更新队列^_^