实验(堆栈)
来源:互联网 发布:苹果手机日志软件 编辑:程序博客网 时间:2024/05/18 22:40
本实验主要是栈的基本操作。包括顺序栈,链栈,及用栈实现后缀表达式求值,以及实现括号匹配的检验。
程序代码全部是先给出主函数.cpp代码部分,后面跟着的是.h文件。
顺序栈
#include"sq_stack_test.h"int main(){ sq_stack stack; sq_stack_init(stack); for (int i = 1; i <= 6; i++) { sq_stack_push(stack, i); cout << i << "进栈,栈大小为" << sq_stack_length(stack) << ",栈内容:"; sq_stack_traverse(stack); } cout << endl; int e; while (stack.top != -1) { sq_stack_pop(stack, e); cout << e << "出栈,栈大小为" << sq_stack_length(stack) << ",栈内容:"; sq_stack_traverse(stack); } return 0;}
#pragma once#include<iostream>#include<string>using namespace std;const int SIZE = 100;typedef int elem_type;//定义栈typedef struct { int *elem; int top; int size;}sq_stack;void error_message(string s);//提示错误信息void increment(sq_stack &s);//加长栈空间void sq_stack_init(sq_stack &s);//初始化栈void sq_stack_clear(sq_stack &s);//清空栈void sq_stack_destroy(sq_stack &s);//销毁栈void sq_stack_push(sq_stack &s, elem_type e);//入栈void sq_stack_pop(sq_stack &s, elem_type &e);//出栈void get_sq_stack_top(sq_stack s, elem_type &e);//获取栈顶元素int sq_stack_length(sq_stack s);//栈长度bool sq_stack_empty(sq_stack s);//判断栈空bool sq_stack_full(sq_stack s);//判断栈满void sq_stack_traverse(sq_stack s);//遍历输出栈void error_message(string s) { cout << s << endl;}//加长栈空间void increment(sq_stack &s) { int *p = new int[SIZE + s.size]; if (!p) error_message("内存分配失败"); for (int i = 0; i <= s.top; i++) p[i] = s.elem[i]; delete s.elem; s.elem = p; s.size += SIZE;}//初始化栈void sq_stack_init(sq_stack &s) { s.elem = new int[SIZE]; if (!s.elem) error_message("内存分配失败"); s.top = -1; s.size = SIZE;}//销毁栈void sq_stack_destroy(sq_stack &s) { delete s.elem;}//清空栈void sq_stack_clear(sq_stack &s) { s.top = -1;}//进栈void sq_stack_push(sq_stack &s, elem_type e) { if (s.top + 1 >= s.size) { increment(s); } s.elem[++s.top] = e;}//出栈void sq_stack_pop(sq_stack &s, elem_type &e) { if (s.top == -1) { cout << "栈已空,不能出栈" << endl; return; } e = s.elem[s.top--];}//获取栈顶元素void get_sq_stack_top(sq_stack &s, elem_type &e) { if (s.top == -1) { cout << "栈已空,不能获取栈顶元素" << endl; return; } e = s.elem[s.top];}//计算栈的长度int sq_stack_length(sq_stack s) { return s.top + 1;}//判断栈是否空bool sq_stack_empty(sq_stack s) { return s.top + 1 == 0;}//判断栈是否满bool sq_stack_full(sq_stack s) { return s.top + 1 == s.size;}void sq_stack_traverse(sq_stack s) { elem_type e; while (!sq_stack_empty(s)) { sq_stack_pop(s, e); cout << e << " "; } cout << endl;}
链栈
#include"link_stack_test.h"int main(){ link_stack s; link_stack_init(s); for (int i = 1; i <= 6; i++) { cout << i << "入栈"; link_stack_push(s, i); cout << ",栈大小:" << s.size << ",栈内容:"; link_stack_traverse(s); } cout << (link_stack_empty(s) ? "栈已空" : "栈不空") << endl; for (int i = 1; i <= 6; i++) { int e; link_stack_pop(s, e); cout << e << "出栈" << ",栈大小:" << s.size << ",栈内容:"; link_stack_traverse(s); } cout << (link_stack_empty(s) ? "栈已空" : "栈不空") << endl; link_stack_destroy(s); return 0;}
#pragma once#include<iostream>#include<string>#include<cstdlib>using namespace std;typedef int elem_type;typedef struct Node1 { elem_type data; struct Node1 *next;}node;typedef struct Node2 { int size; node *top;}link_stack;void error_message(string s);//错误信息输出提示void link_stack_init(link_stack &s);//链栈初始化void link_stack_clear(link_stack &s);//清空栈void link_stack_destroy(link_stack &s);//销毁栈void link_stack_push(link_stack &s, elem_type e);//入栈void link_stack_pop(link_stack &s, elem_type &e);//出栈bool link_stack_empty(link_stack s);//判断栈空void link_stack_traverse(link_stack s);//遍历栈void error_message(string s) { cout << s << endl; exit(-1);}void link_stack_init(link_stack &s) { s.size = 0; s.top = new node; if (!s.top) error_message("内存分配失败"); s.top->next = nullptr;}void link_stack_clear(link_stack &s) { node *p = s.top->next; node *q = nullptr; while (p) { q = p->next; delete p; p = q; } s.top->next = nullptr; s.size = 0;}void link_stack_destroy(link_stack &s) { node *p = s.top->next; node *q = nullptr; while (p) { q = p->next; delete p; p = q; } delete s.top;}void link_stack_push(link_stack &s, elem_type e) { node *tmp = new node; if (!tmp) error_message("内存分配失败"); tmp->data = e; tmp->next = s.top->next; s.top->next = tmp; s.size++;}void link_stack_pop(link_stack &s, elem_type &e) { if (s.top->next == nullptr) { cout << "栈已空,不能取栈顶元素" << endl; return; } e = s.top->next->data; node *p = s.top->next; s.top->next = p->next; delete p; s.size--;}bool link_stack_empty(link_stack s) { return s.size == 0;}void link_stack_traverse(link_stack s) { node *p = s.top->next; while (p) { cout << p->data << " "; p = p->next; } cout << endl;}
堆栈实验
#include"标头.h"int main(){ go(); return 0;}
#pragma once#include<iostream>#include<string>#include<cstdio>using namespace std;const int SIZE = 100;typedef char elem_type;//定义栈typedef struct { elem_type *elem; int top; int size;}sq_stack;void error_message(string s);//提示错误信息void increment(sq_stack &s);//加长栈空间void sq_stack_init(sq_stack &s);//初始化栈void sq_stack_clear(sq_stack &s);//清空栈void sq_stack_destroy(sq_stack &s);//销毁栈void sq_stack_push(sq_stack &s, elem_type e);//入栈void sq_stack_pop(sq_stack &s, elem_type &e);//出栈void get_sq_stack_top(sq_stack s, elem_type &e);//获取栈顶元素int sq_stack_length(sq_stack s);//栈长度bool sq_stack_empty(sq_stack s);//判断栈空bool sq_stack_full(sq_stack s);//判断栈满void sq_stack_traverse(sq_stack s);//遍历输出栈int suffix_evaluation(char suffix[]);//求后缀表达式的值void bracket_match(char str[]);//检验括号匹配是否正确void play_help1();//游戏1提示帮助函数void play_help2();//游戏2提示帮助函数void play_help3();//游戏3提示帮助函数void go1();//玩后缀表达式计算的游戏void go2();//玩括号匹配检验的游戏void go3();//玩生成不同排列字符串的游戏void go();//总的游戏开始void paly_which();//选择玩哪一个游戏void error_message(string s) { cout << s << endl;}//加长栈空间void increment(sq_stack &s) { elem_type *p = new elem_type[SIZE + s.size]; if (!p) error_message("内存分配失败"); for (int i = 0; i <= s.top; i++) p[i] = s.elem[i]; delete s.elem; s.elem = p; s.size += SIZE;}//初始化栈void sq_stack_init(sq_stack &s) { s.elem = new elem_type[SIZE]; if (!s.elem) error_message("内存分配失败"); s.top = -1; s.size = SIZE;}//销毁栈void sq_stack_destroy(sq_stack &s) { delete s.elem;}//清空栈void sq_stack_clear(sq_stack &s) { s.top = -1;}//进栈void sq_stack_push(sq_stack &s, elem_type e) { if (s.top + 1 >= s.size) { increment(s); } s.elem[++s.top] = e;}//出栈void sq_stack_pop(sq_stack &s, elem_type &e) { if (s.top == -1) { cout << "栈已空,不能出栈" << endl; return; } e = s.elem[s.top--];}//获取栈顶元素void get_sq_stack_top(sq_stack s, elem_type &e) { if (s.top == -1) { cout << "栈已空,不能获取栈顶元素" << endl; return; } e = s.elem[s.top];}//计算栈的长度int sq_stack_length(sq_stack s) { return s.top + 1;}//判断栈是否空bool sq_stack_empty(sq_stack s) { return s.top + 1 == 0;}//判断栈是否满bool sq_stack_full(sq_stack s) { return s.top + 1 == s.size;}//遍历输出栈void sq_stack_traverse(sq_stack s) { elem_type e; while (!sq_stack_empty(s)) { sq_stack_pop(s, e); cout << e << " "; } cout << endl;}//下面是后缀表达式求值//判断是否是运算符bool is_operator(char c) { if (c == '+' || c == '-' || c == 'X' || c == '/') return true; return false;}//实现加减乘除操作char calculate(char a, char oper, char b) { if (oper == '+') return ((a - '0') + (b - '0')) + '0'; if (oper == '-') return ((a - '0') - (b - '0')) + '0'; if (oper == 'X') return ((a - '0')*(b - '0')) + '0'; if (oper == '/') return ((a - '0') / (b - '0')) + '0';}int suffix_evaluation(char suffix[]) { sq_stack s; sq_stack_init(s); char *ch = suffix; char c = *ch++; while (c != '#') { if (!is_operator(c)) sq_stack_push(s, c); else { char e1, e2; sq_stack_pop(s, e1); sq_stack_pop(s, e2); sq_stack_push(s, calculate(e2, c, e1)); //此处注意要把后出栈的e2放在前面 //cout<<calculate(e2,c,e1)<<endl; } c = *ch++; } char e3; sq_stack_pop(s, e3); return e3 - '0';}//以上是后缀表达式求值//括号匹配检验void bracket_match(char str[]) { bool flag = 1; char *p = str; char c = *p++; sq_stack s; sq_stack_init(s); while (c != '#' && flag) { switch (c) { case '(': case '[': sq_stack_push(s, c); break; case ')': { char e; get_sq_stack_top(s, e); if (!sq_stack_empty(s) && e == '(') { sq_stack_pop(s, e); } else { flag = 0; } break; } case ']': { char e; get_sq_stack_top(s, e); if (!sq_stack_empty(s) && e == '[') { sq_stack_pop(s, e); } else { flag = 0; } break; } } c = *p++; } if (flag && sq_stack_empty(s)) cout << "括号匹配无误" << endl; else cout << "括号匹配有误" << endl;}//选择玩哪一个游戏void play_which() { cout << " ****************选择游戏****************" << endl; cout << " | 请输入以下数字,选择要玩的游戏 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |1 →后缀表达式求值 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |2 →括号匹配检验 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |3 →借助栈实现字符串以不同排列方式输出|" << endl; cout << " |--------------------------------------|" << endl; cout << " |--------------------------------------|" << endl; cout << " |Q →退出游戏 |" << endl; cout << " ****************选择游戏****************" << endl;}//游戏1(后缀表达式求值)提示帮助void play_help1() { cout << " *************后缀表达式求值*************" << endl; cout << " |I →输入后缀表达式,要以#结束 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |注意:只能包含的运算符:+,-,X,/ |" << endl; cout << " |--------------------------------------|" << endl; cout << " |--------------------------------------|" << endl; cout << " |Q →退出游戏 |" << endl; cout << " ****************操作提示****************" << endl;}//游戏2(括号匹配检验)提示帮助void play_help2() { cout << " **************括号匹配检验**************" << endl; cout << " |I →输入含括号表达式,要以#结束 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |注意:只能包含的括号种类:[]() |" << endl; cout << " |--------------------------------------|" << endl; cout << " |--------------------------------------|" << endl; cout << " |Q →退出游戏 |" << endl; cout << " ****************操作提示****************" << endl;}//游戏3(给出不同的字符串排列)提示帮助void play_help3() { cout << " ****************字符排列****************" << endl; cout << " |+X →X入栈 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |- →出栈 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |E →栈是否已空 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |F →栈是否已满 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |C →清空栈 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |T →遍历栈 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |L →栈的大小 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |R →强制重新开始游戏 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |. →显示输入输出字符顺序 |" << endl; cout << " |--------------------------------------|" << endl; cout << " |--------------------------------------|" << endl; cout << " |Q →退出游戏 |" << endl; cout << " ****************操作提示****************" << endl;}//后缀表达式计算void go1() { play_help1(); char c; while (cin >> c) { switch (c) { case 'I': { cout << "请输入一个后缀表达式: "; char s[1000]; scanf("%s", s); cout << suffix_evaluation(s) << endl << endl; break; } case 'Q':return; default:cout << "输入错误,请看操作提示重新输入!" << endl; break; } }}//括号匹配检验void go2() { play_help2(); char c; while (cin >> c) { switch (c) { case 'I': { cout << "请输入一个含括号表达式: "; char s[1000]; scanf("%s", s); bracket_match(s); cout << endl; break; } case 'Q':return; default:cout << "输入错误,请看操作提示重新输入!" << endl; break; } }}//给出不同字符串排列void go3() { play_help3(); sq_stack sta; sq_stack_init(sta); char c; int cnt1 = 0, cnt2 = 0; char str1[1000], str2[1000]; while (cin >> c) { switch (c) { case '+':cin >> c; sq_stack_push(sta, c); cout << c << "入栈" << endl; str2[cnt2++] = c; break; case '-': sq_stack_pop(sta, c); str1[cnt1++] = c; cout << c << "出栈" << endl; cout << (sq_stack_empty(sta) ? "栈已空" : "栈不空") << endl; break; case 'E':cout << (sq_stack_empty(sta) ? "栈已空" : "栈不空") << endl; break; case 'F':cout << (sq_stack_full(sta) ? "栈已满" : "栈不满") << endl; break; case 'C':sq_stack_clear(sta); cout << (sq_stack_empty(sta) ? "栈已空" : "栈不空") << endl; break; case 'L':cout << "栈大小:" << sq_stack_length(sta) << endl; break; case 'T':sq_stack_traverse(sta); break; case '.': str1[cnt1] = '\0'; str2[cnt2] = '\0'; cout << "入栈顺序: " << str2 << endl; cout << "出栈顺序: " << str1 << endl << endl; cnt1 = 0; cnt2 = 0; break; case 'R':cnt1 = cnt2 = 0; sq_stack_clear(sta); cout << "强制重新开始游戏" << endl; break; case 'Q':return; } }}void go() { play_which(); char c; while (cin >> c) { switch (c) { case '1':go1(); break; case '2':go2(); break; case '3':go3(); break; case 'Q':return; default:cout << "输入错误,请看操作提示重新输入!" << endl; break; } play_which(); }}
阅读全文
0 0
- 实验(堆栈)
- 堆栈实验第二题
- 数据结构:实验5(求堆栈元素和)
- 堆栈应用括号匹配实验
- 检查堆栈溢出的实验
- 实验五出现的问题堆栈
- 数据结构-堆栈和队列的实验
- 算法实验题 车皮编序问题(转化为在全排列的基础上的堆栈问题)
- [C++]数据结构实验04:使用堆栈进行简单的四则运算
- 《数据结构学习与实验指导》3-8:堆栈模拟队列
- SGCheck:一个实验堆栈和全局数组溢出检测器
- java堆栈 (转)
- 堆栈(来自百度)
- java堆栈 (转)
- /STACK(堆栈分配)
- 堆栈(Stack)
- 数据结构---堆栈(C#)
- /STACK(堆栈分配)
- Spring Boot初识
- 【BZOJ1857】传送带(三分)
- 统计学---极端异常值的检测
- Blog的API(php裸写
- (lintcode)第31题,数组划分
- 实验(堆栈)
- [ZJOI2005]午餐 贪心+dp
- 深入理解Java虚拟机之对象存活算法的实现(2)
- 【Python数据分析与展示】(八)数据合并、规整化
- JavaScript(4)- DOM
- 消失的硬盘空间:du与df统计不一致的解决方法
- 责任链模式
- shell 脚本之变量嵌套
- 插件接口的设计