栈的设计与使用

实验内容

设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达的值

解题思路

(1)一般算术表达(中缀表达),如#3×(4+2)/2-5#,#为表达式界定符,逆波兰表达式(后缀表达式),如前述表达的后缀表达式为:3 4 2 + × 2 / 5 - 设中缀表达式的运算符有+、-、×、/、#五种,运算符的优先级别从高到低为()、×、/、+、-、#;有括号先算括号内,再算括号外的,多层括号由内向外进行。中缀表达式转换为后缀表达式需要用到一个临时栈optr暂存运算符。(由于*会引起格式问题,所以以上叙述用×代替)

具体代码如下

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;const int StackSize = 100;
template<typename DataType>
class SeqStack {public:SeqStack() {top = -1;}~SeqStack() {top = -1;}void Push(DataType x);DataType Pop();DataType GetTop();DataType GetTopfront();int GetCount();bool Empty();void Display();DataType* returnArr();
private:DataType data[StackSize];int top;
};template<typename DataType>
DataType SeqStack<DataType>::GetTopfront()
{return DataType();
}
template<typename DataType>
void SeqStack<DataType>::Push(DataType x) {if (top == StackSize - 1) throw "上溢";data[++top] = x;
}
template<typename DataType>
DataType SeqStack<DataType>::Pop() {DataType x;if (top == -1) throw "下溢";x = data[top--];return x;
}
template<typename DataType>
DataType SeqStack<DataType>::GetTop() {return data[top];
}template<typename DataType>
int SeqStack<DataType>::GetCount() {return top+1;
}
template<typename DataType>
bool SeqStack<DataType>::Empty() {if (top == -1)return true;elsereturn false;
}
template<typename DataType>
void SeqStack<DataType>::Display() {for (int i = 0; i <= top; i++) {cout << data[i]<<' ';}cout << endl;
}
template<typename DataType>
DataType* SeqStack<DataType>::returnArr() {return data;
}SeqStack<char> optr;
SeqStack<char> outstack;
int Priority(char op) {if (op == '*' || op == '/')return 2;else if (op == '+' || op == '-')return 1;else if (op == '#')return 0;elsereturn -1;
}// 判断输入串中的字符是不是操作符,如果是返回true
bool isOperator(char op) {if (op == '+' || op == '-' || op == '*' || op == '/'|| op == '#')return true;elsereturn false;
}
// 对两个数进行运算
double Operate(double x, double y, char op) {if (op == '+')return x + y;else if (op == '-')return x - y;else if (op == '*')return x * y;else if (op == '/')return x / y;elsereturn -1;
}//将中缀表达式转换为逆波兰表达式
void change(char* s, int len) {for (int i = 0; i < len; i++) {//1)求输入串的逆序。if (isdigit(s[i])) {outstack.Push(s[i]);     // 判断是否是数字,假如是操作数,把它添加到输出串中。while (i + 1 < len && isdigit(s[i + 1])) {outstack.Push(s[i + 1]);i++;}}if (s[i] == '(') {               // 假如是"(",将它入栈optr.Push(s[i]);}while (isOperator(s[i])) {       // 如果是运算符,执行算法对应操作;if (optr.Empty() || optr.GetTop() == '(' || Priority(s[i]) > Priority(optr.GetTop())) {  // 如果是空栈或者栈顶为")"或者新来的元素优先级更高optr.Push(s[i]);break;}else if (s[i] == '#' && optr.GetTop() == '#') {    //当栈顶元素与当前字符都是'#'时则将栈顶的'#'弹出,break结束内部循环,i++结束外部循环optr.Pop();i++;break;}else {                       // 否则就把字符栈顶元素放到输出串中outstack.Push(optr.Pop());}}if (s[i] == ')') {                               //假如是")",栈中运算符逐个出栈并输出,直到遇到"(",同时将"("出栈并丢弃。while (optr.GetTop() != '(') {outstack.Push(optr.Pop());}optr.Pop();}}
}// 计算后缀表达式返回结果
double calculate(SeqStack<char> out) {//栈中的元素个数int len = out.GetCount();//返回数组char* s = out.returnArr();//设定临时堆栈opnd暂存计算过程的中间结果SeqStack<double> opnd;for (int i = 0; i < len; i++) {if (isdigit(s[i])) {//字符数字的’0’ASCII码值为48,所以任意0~9字符数字的ASCII值减去“0”的ASCII值即是他的整型数字int x = s[i] - '0';//字符数字转为整型数字后压入栈中opnd.Push(x);}else{double X1 = opnd.Pop();double X2 = opnd.Pop();opnd.Push(Operate(X2, X1, s[i]));}}return opnd.Pop();
}int main() {char A[] = "#3*(4+2)/2-5#";int len = sizeof(A)/sizeof(char)-1;cout << "中缀表达式为:" << A << endl;change(A, len);cout << "后缀表达式为:";outstack.Display();cout << "后缀表达式的计算值为:" << calculate(outstack) << endl;outstack.~SeqStack();system("pause");return 0;
}

设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值相关推荐

  1. 回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列

    回溯法 题目描述: 设计一个算法在1.2.3- 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性.例如1+2+34-5+67-8+9=100 分 ...

  2. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来

    题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...

  3. 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底

    问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...

  4. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子

    问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...

  5. 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...

    版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/28281631 转载请注明出 ...

  6. 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)

    设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的). #include <stdio.h> #include<malloc.h> typedef str ...

  7. python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...

    展开全部 long 类型对大数阶乘来e68a8462616964757a686964616f31333365633963说存储范围大小,强行使用会溢出,可以使用 BigDecimal. 代码如下:im ...

  8. 数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母

    假设有一个带头结点的单链表L,每个结点值由单个数字.小写字母和大写字母构成.设计一个算法将其拆分成3个带头结点的单链表L1.L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3 ...

  9. 设计一个算法,借助栈实现单链表链接顺序的逆转

    设计一个算法,借助栈实现单链表链接顺序的逆转: 程序思路:题目要求为借助栈将单链表中的数据逆置输出,栈的特点就是先进后出,只 需要将单链表中的数据依次存储在栈中,然后将栈中的元素依次取出即可.关键代码 ...

最新文章

  1. QT5中如何使用SQLite
  2. 在MVC框架上定时执行某种操作
  3. 用800行代码做个行为树(Behavior Tree)的库(2
  4. C语言经典例68-数组元素循环偏移
  5. IO多路复用之select篇
  6. 【Java数据结构】自己实现一个HahMap(实现其put, toString, get方法)
  7. html标签api,html5新增标签+API介绍
  8. (SRNTT)Image Super-Resolution by Neural Texture Transfer
  9. Docker垃圾清理方案
  10. java 获取发布后的路径问题_Java中的路径问题实例分析
  11. 微信网页开发那些破事儿
  12. MongoDB查询命令详解
  13. 新硬盘装机出现Disk Read Error解决方案
  14. 为何现在欠钱的人,都不爱还钱,太气人了...
  15. 飘逸的python - 实现控制台进度条效果
  16. 减少2021年度汇算清缴补税
  17. 中公教育python教师_为什么中公教育、华图的老师不自己去考公务员?
  18. 服务器遇到一个意外的情况,阻止它完成请求
  19. P2947 向右看齐
  20. 漫画:二叉树系列 第五讲(BST的删除)

热门文章

  1. 【快代理API】获取订单IP提取余额
  2. 加密的病例单 简单c版
  3. Redis【有与无】【Lettuce】L10.编解码器
  4. javascript实现对图片的随意拖拽,放大缩小
  5. 求助大神:valgrind 出现 address 0x0 is not stack'd or (recently)freee'd怎么解决?linuxclionvalgrind## 标题
  6. Oracle数据库用户管理之二---权限授权去权(用户和角色)
  7. 哈夫曼树的正确打开方式
  8. 操作系统概念 线程调度
  9. Spring 之 Converter转换器
  10. 一篇文章让你搞明白,早教到底教什么!