【数据结构】中缀表达式、后缀表达式、前缀表达式的转换和其运算方法(包含顺序栈的模板)

您所在的位置:网站首页 前缀表达式和后缀表达式的关系 【数据结构】中缀表达式、后缀表达式、前缀表达式的转换和其运算方法(包含顺序栈的模板)

【数据结构】中缀表达式、后缀表达式、前缀表达式的转换和其运算方法(包含顺序栈的模板)

2024-06-06 07:15| 来源: 网络整理| 查看: 265

简介

本次实验我采用C++语言来做了一个栈的模板栈,其内容包括以下函数

模板栈部分 stack() 初始化函数; stack(const stack &s) 采用栈去初始化另一个栈 void push(T e) 压栈,由于采用的顺序栈的思路,还会判断空间大小是否足够,若不够则扩容 void pop() 弹栈函数 T top_sq() 返回栈顶元素 ll length() 返回栈的长度 bool empty() 判断栈是否为空

并设计了几个小函数和数组来辅助运算,主要包括以下内容

辅助函数部分 unsigned char prior[7][7] 存运算符优先级关系, char opset[7] = {’+’, ‘-’, ‘*’, ‘/’, ‘(’, ‘)’, ‘#’}; 存运算符,方便找出其对应下标 int returnOpOrd(char op, char *TestOp) 用于返回运算符下标 char precede(char Aop, char Bop) 利用returnOpOrd计算比较运算符优先级 bool isdigit(char ch) 判断是否为数据 bool isop(char ch) 判断是否为运算符 double calculate(double a, double b, char c) 进行数学计算的函数

另设计5个主要函数,包括

主体函数部分 void to_pre() 转前缀表达式 算法思路: 从右到左判断进入的字符 1、若为数字先进行?多位数的处理,然后将数据压入数据栈, 2、如果是运算符 判断栈空或栈顶为) 若是则直接压入运算符栈 否则比较运算符优先级,若优先级比栈顶大,则继续压入运算符栈;否则弹出栈顶,并将其存入数据栈;循环判断直至将当前运算符压入运算符栈 3、若为),则直接压入运算符栈;若为(,则判断栈顶是否为),若不是则弹出栈顶,并将其存入数据栈,直至栈顶为),然后将栈顶弹出 (消除括号对) void to_suf() 转后缀表达式 算法思路: 从左到右判断进入的字符 1、若为数字先进行?多位数的处理,然后将数据压入数据栈, 2、如果是运算符 判断栈空或栈顶为( 若是则直接压入运算符栈 否则比较运算符优先级,若优先级比栈顶大,则继续压入运算符栈;否则弹出栈顶,并将其存入数据栈;循环判断直至将当前运算符压入运算符栈 3、若为(,则直接压入运算符栈;若为),则判断栈顶是否为(,若不是则弹出栈顶,并将其存入数据栈,直至栈顶为(,然后将栈顶弹出(消除括号对) void cal_pre(stack s) 计算前缀表达式 算法思路: 将存前缀表达式的数据栈逐一弹出元素 若为数据则采用stof函数将其转换成浮点数后压入数据栈 若为运算符则直接从数据栈弹出适当数据进行运算,并将结果存入数据栈 最终数据栈只能只剩下一个元素,该元素即为表达式的计算结果 void cal_suf(stack s) 计算后缀表达式 算法思路: 将存后缀表达式的数据栈逐一弹出元素 若为数据则采用stof函数将其转换成浮点数后压入数据栈 若为运算符则直接从数据栈弹出适当数据进行运算,并将结果存入数据栈 最终数据栈只能只剩下一个元素,该元素即为表达式的计算结果 void cal_normal() 计算中缀表达式 算法思路: 直接对输入的数据 a 从左到右进行运算: 1、若为数字先进行?多位数的处理,然后将数据压入数据栈, 2、如果是运算符 判断栈空或栈顶为( 若是则直接压入运算符栈 否则比较运算符优先级,若优先级比栈顶大,则继续压入运算符栈;否则弹出栈顶,并从数据栈取出适当数据与其进行运算,将运算结果存入数据栈;循环判断直至将当前运算符压入运算符栈 3、若为(,则直接压入运算符栈;若为),则判断栈顶是否为(,若不是则弹出栈顶,并从数据栈取出适当数据与其进行运算,将运算结果存入数据栈;直至栈顶为(,然后将栈顶弹出(消除括号对) 4、判断运算符栈是否为空,若不为空,则从数据栈取出适当数据与其进行运算,并将运算结果压入数据栈;循环判断直至运算符栈为空,此时数据栈只会剩下一个元素,该元素即为计算结果

主函数部分

在主函数中主要采用string定义变量a来进行输入中缀表达式,并调用转换成前缀和后缀表达式的函数进行表达式的转换,然后输出结果并将前后缀表达式结果另存在新建栈中,在接着调用前后缀表达式的结果来作为参数来调用计算前缀表达式的结果函数和计算后缀表达式的结果函数并将计算结果分别输出,并调用计算中缀表达式的结果的函数来运算,在该函数中直接对输入在a中的数据进行运算,最后输出计算结果。

代码如下 #include #include #include #include #define FAST \ ios::sync_with_stdio(false); \ cin.tie(NULL); \ cout.tie(NULL) #define pr printf #define sc scanf #define sf(n) scanf("%d", &n) #define sff(n1, n2) scanf("%d %d", &n1, &n2) #define sfff(n1, n2, n3) scanf("%d %d %d", &n1, &n2, &n3) #define sl(n) scanf("%lld", &n) #define sll(n1, n2) scanf("%lld %lld", &n1, &n2) #define slll(n1, n2, n3) scanf("%lld %lld %lld", &n1, &n2, &n3) #define rep0(i, n) for (i = 0; i base = new T[N]; top = base; size_max = N; _length = 0; } stack(const stack &s) { size_max = s.size_max; base = s.base; top = s.top; _length = s._length; } void push(T e) { if (top - base == size_max) { while (top - base == size_max) size_max if (top == base) throw "栈空"; T e = *--top; *top++; return e; } ll length() { return _length; } bool empty() { if (top == base) return true; return false; } }; unsigned char prior[7]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3