C++实现中缀表达式转前、后缀
- #include<iostream>
- #include<string>
- #include<stack>
- using namespace std;
- bool isInt(char ch)
- {
- if(ch>='0'&&ch<='9')
- return true;
- return false;
- }
- bool isOperator(char ch)
- {
- if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
- return true;
- return false;
- }
- int opLevel(char ch)
- {
- int level;
- switch(ch)
- {
- case'+':
- case'-':
- level=1;
- break;
- case'*':
- case'/':level=2;
- break;
- default:
- level=0;
- break;
- }
- return level;
- }
- /*中缀-->前缀 算法
- 1)求输入串的逆序。
- 2)检查输入的下一元素。
- 3)假如是操作数,把它添加到输出串中。
- 4)假如是闭括号,将它压栈。
- 5)假如是运算符,则
- i)假如栈空,此运算符入栈。
- ii)假如栈顶是闭括号,此运算符入栈。
- iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。
- iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5。
- 6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。
- 7)假如输入还未完毕,跳转到步骤2。
- 8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。
- 9)求输出串的逆序。
- */
- string priOrder(string myStr)
- {
- stack<char> opStack;
- string result;
- for(int i=myStr.length()-1; i>=0; i--)
- {
- char ch=myStr[i];
- if(isInt(ch))
- {
- result.push_back(ch);
- }
- else if(')'==ch)
- {
- opStack.push(ch);
- }
- else if(isOperator(ch))//操作符
- {
- while(true)
- {
- if(opStack.empty()||opStack.top()==')'||(opLevel(ch)>=opLevel(opStack.top())))
- {
- opStack.push(ch);
- break;
- }
- else
- {
- result.push_back(opStack.top());
- opStack.pop();
- }
- }
- }
- else if('('==ch)
- {
- while(opStack.top()!=')')
- {
- result.push_back(opStack.top());
- opStack.pop();
- }
- opStack.pop();
- }
- }
- while(!opStack.empty())
- {
- result.push_back(opStack.top());
- opStack.pop();
- }
- return result;
- }
- /*中缀-->后缀 算法
- */
- string postOrder(string myStr)
- {
- string result;
- stack<char> opStack;
- for(int i=0; i<myStr.length(); i++)
- {
- char ch=myStr[i];
- if(isInt(ch))
- {
- result.push_back(ch);
- }
- else if('('==ch)
- {
- opStack.push(ch);
- }
- else if(isOperator(ch))
- {
- while(true)
- {
- if(opStack.empty()||opStack.top()=='('||opLevel(ch)>=opLevel(opStack.top()))
- {
- opStack.push(ch);
- break;
- }
- else
- {
- result.push_back(opStack.top());
- opStack.pop();
- }
- }
- }
- else if(')'==ch)
- {
- while(opStack.top()!='(')
- {
- result.push_back(opStack.top());
- opStack.pop();
- }
- opStack.pop();
- }
- }
- while(!opStack.empty())
- {
- result.push_back(opStack.top());
- opStack.pop();
- }
- return result;
- }
- int main()
- {
- string myStr;
- cin>>myStr;
- string result;
- result=priOrder(myStr);
- for(int i=result.length()-1; i>=0; i--)
- {
- cout<<result[i];
- }
- cout<<endl;
- result=postOrder(myStr);
- for(int i=0; i<=result.length(); i++)
- {
- cout<<result[i];
- }
- return 0;
- }
C++实现中缀表达式转前、后缀的更多相关文章
- [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)
题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535 Descripti ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- 【java】中缀表达式转后缀表达式 java实现
算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...
- [LeetCode] 由 “中缀表达式 --> 后缀表达式" 所想
如何利用栈解决问题. Ref: 如何在程序中将中缀表达式转换为后缀表达式? 本文的引申:如何手写语法分析器 实现调度场算法 “9+(3-1)*3+10/2” --> “9 3 1-3*+ 10 ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- ACM题目————中缀表达式转后缀
题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...
- 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)
定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...
- NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )
郁闷的C小加(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...
- hdu-1237 简单计算器---中缀表达式转后缀表达式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 思路 ...
随机推荐
- vim 多行同时输入,且输入数值递增
很有用的命令. 很给力的说. http://vim.wikia.com/wiki/Making_a_list_of_numbers 我在 html中需要增加新的标签的时候,就有用到过. 原来的html ...
- VS2012编译LibZip库
LibZip库是解压缩zip文件的C库. 中文的网站目前还没有找到相关的编译方法,找了一篇英文文档加上自己的实验修改了一下: 编译步骤如下: 首先先下载CMake,我下载的是2.8版本. libzip ...
- ext2 源代码解析之 “从路径名到目标结点” (一)
两个主要函数,path_init和path_walk,他们结合在一起根据给定的文件路径名称在内存中找到或者建立代表着目标文件或目录的dentry和inode结构.注意,最终是信息是读取到内存中的.其中 ...
- QT 菜单程序
MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include<QMainWindow> #include<QMess ...
- php+redis实现多台服务器内网存储session并读取
大型网站由于大并发的问题会导致系统出现诡异的崩溃性问题这着实让人很是蛋疼,首先考虑的就是负载均衡服务器来处理这个,当然数据库的性能也是非常非常重要的,今天就说下在负载均衡情况下对于session这个问 ...
- C# 中判断字符串是不是汉字
//1.用ASCII码判断 //在 ASCII码表中,英文的范围是0-127,而汉字则是大于127,具体代码如下: string text = "是不是汉字,ABC,柯乐义"; ; ...
- Mvc分页组件MvcSimplePager代码重构
1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...
- C#开发学习——web服务器端控件
Asp.net在客户端开发和web开发所用到的控件还是有很大的差别的,而且Web开发的界面是在浏览器中显示的,所以控件的设计都和前边学习HTML设计有联系,没有客户端开发那么简单,不过我们可以 ...
- C语言递归回溯法迷宫求解
本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...
- HTTP协议----ETag
Etag是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等.具体内部含义是服务器控制的,就像Cookie那样. 服务器首先产生ETag,服务器可在稍后使用它来 ...