实验(堆栈)

来源:互联网 发布:苹果手机日志软件 编辑:程序博客网 时间: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();    }}
原创粉丝点击