一、顺序栈
#include <iostream> using namespace std; #define MAXSIZE 100 //栈的最大容量 typedef struct { int* base;//栈底指针 int* top;//栈顶指针 int stacksize;//栈可用的最大容量 }SqStack; void InitStack(SqStack& S) { //构造空栈 S.base = new int[MAXSIZE]; if (!S.base) exit(OVERFLOW);//存储分配失败 S.top = S.base;//top初始为base表示为空栈 S.stacksize = MAXSIZE; } //入栈 bool Push(SqStack& S, int e) { //插入元素e为新的栈顶元素 if (S.top - S.base == S.stacksize) return false;//栈满 *S.top++ = e;//元素e压入栈顶,栈顶指针加1 return true; } //出栈 bool Pop(SqStack& S, int& e) { //删除S的栈顶元素,用e返回其值 if (S.top == S.base) return false;//top=base表示为空栈,返回NULL e=*(--S.top);//栈顶指针减1,将栈顶元素赋值给e return true; } //取栈顶元素,返回S的栈顶元素,不修改栈顶指针 int GetTop(SqStack S) { if (S.top != S.base) return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变 return NULL; } //判断顺序栈S是否为空栈 bool isEmpty(SqStack S) { if (S.top!=S.base) return false;//不为空返回fasle return true;//为空返回true } //批量入栈 void StackInput(SqStack& S) { int value; cout << "请输入入几次栈:"; cin >> S.stacksize;//用户输入入几次栈 for (int i = 0; i < S.stacksize; i++) { cout << "请输入第" << i + 1 << "个值:"; cin >> value; if (Push(S, value)) cout << "入栈成功!"<<endl; else cout << "入栈失败!"; } } //依次弹出栈顶元素 void StackOut(SqStack& S) { int value; cout << "依次弹出的栈顶元素为:\n"; while (Pop(S,value)) { cout << value << "\t"; } } int main() { int opearateNum = 0;//操作值 SqStack S; InitStack(S);//初始化堆栈 while (true) { cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl; cin >> opearateNum; if (opearateNum == 5) break; switch (opearateNum) { case 1: //入栈 StackInput(S); system("pause"); system("cls"); break; case 2: //依次出栈 StackOut(S); system("pause"); system("cls"); break; case 3: //读栈顶元素 if (!isEmpty(S))cout << GetTop(S) << endl; else cout << "堆栈无元素!" << endl; system("pause"); system("cls"); break; case 4: //弹出栈顶元素 int value;//弹出的值 if (!Pop(S, value)) cout << "堆栈无元素" << endl; else cout << "弹出的栈顶元素的值为:" << value << endl; system("pause"); system("cls"); break; default: cout << "无效操作,请重新输入!" << endl; break; } } }
二、链栈
#include <iostream> using namespace std; //链栈的存储结构 typedef struct StackNode { int elem;//栈中的数据元素 struct StackNode* next; }*LinkStack; //链栈的初始化 void InitStack(LinkStack& S) { S = NULL;//构造一个空栈S } //入栈,在栈顶插入元素e bool Push(LinkStack &S,int e) { StackNode *p = new StackNode;//生成新结点 p->elem = e;//将新结点p的数据域设置为e p->next = S;//将新结点插入栈顶 S = p;//修改栈顶指针为p return true; } //出栈,删除S的栈顶元素,用第二个参数返回其值 bool Pop(LinkStack& S, int& e) { if (S == NULL) return false;//栈空 返回false e = S->elem;//将栈顶元素值赋给e StackNode* p = S;//用p临时保存栈顶元素空间,以备释放 S = S->next;//修改栈顶指针 delete p;//释放原来的栈顶内存空间 return true; } //取栈顶元素,不修改栈顶指针 int GetTop(LinkStack S) { if (S != NULL) return S->elem;//如果栈为非空则返回栈顶元素 } //判断链栈S是否为空栈 bool isEmpty(LinkStack S) { if (S != NULL) return false;//不为空返回fasle return true;//为空返回true } //批量入栈 void StackInput(LinkStack& S) { int value; int PushNum;//入栈数 cout << "请输入入几次栈:"; cin >> PushNum;//用户输入入几次栈 for (int i = 0; i < PushNum; i++) { cout << "请输入第" << i + 1 << "个值:"; cin >> value; if (Push(S, value)) cout << "入栈成功!" << endl; else cout << "入栈失败!"; } } //依次弹出栈顶元素 void StackOut(LinkStack& S) { int value; cout << "依次弹出的栈顶元素为:\n"; while (Pop(S, value)) { cout << value << "\t"; } } int main() { int opearateNum = 0;//操作值 LinkStack S; InitStack(S);//初始化堆栈 while (true) { cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl; cin >> opearateNum; if (opearateNum == 5) break; switch (opearateNum) { case 1: //入栈 StackInput(S); system("pause"); system("cls"); break; case 2: //依次出栈 StackOut(S); system("pause"); system("cls"); break; case 3: //读栈顶元素 if (!isEmpty(S)) cout << GetTop(S) << endl; else cout << "堆栈为空栈!" << endl; system("pause"); system("cls"); break; case 4: //弹出栈顶元素 int value;//弹出的值 if (!Pop(S, value)) cout << "堆栈为空栈!" << endl; else cout << "弹出的栈顶元素的值为:" << value << endl; system("pause"); system("cls"); break; default: cout << "无效操作,请重新输入!" << endl; break; } } }