实验(堆栈)

本实验主要是栈的基本操作。包括顺序栈,链栈,及用栈实现后缀表达式求值,以及实现括号匹配的检验。
程序代码全部是先给出主函数.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值