本实验主要是栈的基本操作。包括顺序栈,链栈,及用栈实现后缀表达式求值,以及实现括号匹配的检验。
程序代码全部是先给出主函数.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();
}
}