C++ 中缀转后缀并求值
## 1.中缀转后缀算法思想
遍历字符串:一.若为数字1~9,进入后缀队列;二.若为左括号‘(’,进入符号栈;三.若为右括号’)‘,将栈顶元素压入后缀队列,直到栈顶为’(‘;四.若为‘+’,‘-‘,当栈不为空时,将栈顶元素压入后缀队列,直到栈顶为’(‘;五.若为’*‘,’\‘,当栈不为空且栈顶元素不为’+‘,’-‘时,将栈顶元素压入后缀队列,直到栈顶为’(‘。遍历结束时,若栈不为空,将栈内元素压入后缀队列。
2.后缀表达式求值算法思想
遍历后缀表达式:一.若为数字1~9,进入数据栈;二.若为运算符:’+‘,’-‘,’*‘,’/‘,取出数据栈顶两个元素进行运算,结果压栈三.输出栈顶元素。
运行代码
// test0304.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<iostream>
using namespace std;#include<stack>
#include<queue>
int transform_calculate(char* c);int _tmain(int argc, _TCHAR* argv[])
{char c1[]={"((1+2)*(3+4))"};transform_calculate(c1);char c2[]="(((1+2)*3-4)/5)";transform_calculate(c2);system("pause");return 0;
}
int transform_calculate(char* c)
{stack<char> s;stack<int> s1;queue<char> q;cout<<"中缀表达式:";for (int i = 0; i < strlen(c); i++){cout<<c[i]<<" ";}cout<<endl;for(int i=0;i<strlen(c);i++){if(c[i]>'0'&&c[i]<='9')q.push(c[i]);else if(c[i]=='(')s.push(c[i]);else if(c[i]==')'){while(s.top()!='('){q.push(s.top());s.pop();}s.pop();}else if(c[i]=='+'||c[i]=='-'){while(s.top()!='('){if(!s.empty()){q.push(s.top());s.pop();}}s.push(c[i]);}else if(c[i]=='*'||c[i]=='/'){while(s.top()!='('&&s.top()!='+'&&s.top()!='-'){if(!s.empty()){q.push(s.top());s.pop();}}s.push(c[i]);}}while(!s.empty()){q.push(s.top());s.pop();}cout<<"后缀表达式:";queue<char> p=q;while(!p.empty()){cout<<p.front()<<" ";p.pop();}cout<<endl;while(!q.empty()){if(q.front()>'0'&&q.front()<='9'){s1.push(q.front()-'0');q.pop(); }else if(q.front()=='+'){int i=s1.top();s1.pop();int j=s1.top();s1.pop();s1.push(j+i);q.pop();}else if(q.front()=='-'){int i=s1.top();s1.pop();int j=s1.top();s1.pop();s1.push(j-i);q.pop();}else if(q.front()=='*'){int i=s1.top();s1.pop();int j=s1.top();s1.pop();s1.push(j*i);q.pop();}else if(q.front()=='/'){int i=s1.top();s1.pop();int j=s1.top();s1.pop();s1.push(j/i);q.pop();}}cout<<"计算结果:";while(!s1.empty()){cout<<s1.top();s1.pop();}cout<<endl<<endl;return true;
}
运行结果
C++ 中缀转后缀并求值相关推荐
- 中缀转后缀并求值(多位数版本)
//中缀转后缀思路: //转换过程需要用到栈,具体过程如下: //1)如果遇到操作数,我们就直接将其输出. //2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中. //3)如果 ...
- iOS仿写计算器中缀转后缀 表达式求值
github地址 iOS计算器 准备工作 由于OC没有自带的栈文件,只能链表模拟栈 typedef struct {char data[50];int top; }Stack;//符号栈 //之前把D ...
- 【数据结构与算法】中缀表达式 - 后缀表达式 - 求值
中缀转后缀 #include <stdio.h> #include <stdlib.h>#define STACK_INIT_SIZE 20 #define STACKINCR ...
- c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!
已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...
- 前缀,中缀,后缀表达式求值
前缀表达式求值: 对于一个前缀表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个"数 ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- 表达式求值(中缀转后缀及后缀表达式求值)
.中缀表达式转后缀表达式: 中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出: 2.栈为空时,遇到运算符,入栈: 3.遇到左括号,将其入栈: 4.遇到右括号,执行出栈操作,并将出栈的元素 ...
- c++实现中缀转前缀,中缀转后缀,后缀表达式求值
中缀转前缀 思想: 用两个栈实现,规则如下: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2: (2) 从右至左扫描中缀表达式: (3) 遇到操作数时,将其压入S2: (4) 遇到运算符时, ...
- 栈应用:后缀表达式求值
在上一篇博客 栈应用:中缀表达式转后缀表达式 中我们知道如何通过栈将中缀表达式转为后缀表达式,这次我们继续用栈 来实现后缀表达式求值,结合上一篇博客. 上一篇博客中是用c语言实现的,由于c语言中不支持 ...
最新文章
- 被“钱”困住的开源开发者们!
- 学习笔记(十二)——虚拟机安装和pycharm远程连接Ubuntu
- 全球及中国牛乳腺炎治疗系统行业发展调研及投资预测分析报告2022-2027年
- 使用Docker for Windows初体验
- cmd命令生成webservice_使用wsimport命令生成webService客户端代码实例
- Python 列表list与数组array的区别
- servlet中访问mysql无法包含中文的解决
- 分享一套非常不错的bootstarp3.0.2响应式模板
- php进程数是指什么,25.查看php 某个服务的进程数
- IIS之Web服务器
- linux tcl expect 安装(转)
- ssdp协议 upnp_【零知ESP8266】教程:SSDP简单服务发现协议示例
- 20120902 07
- 最新Java面试题整理!java字符大写转小写
- 关于丢番图方程x^2+y^2=n
- WIN10企业版未激活如何解决
- 关于unity3D shader的UV理解
- Visual Studio Code插件
- android开发实例之minitwitter登录界面+代码,登录界面_记住密码
- 支持生僻字且自动识别utf-8编码的php汉字转拼音类,支持生僻字且自动识别utf-8编码的php汉字转拼音类_php技巧...