首页 > 编程语言 >C++中缀表达式求值(中缀表达式转后缀表达式)

C++中缀表达式求值(中缀表达式转后缀表达式)

时间:2023-02-08 15:33:03浏览次数:55  
标签:中缀 int top stk while str ans 求值 表达式


problem

  • 给你一个中缀表达式,就是平常的算术式,比如这样的1+4/2*3+4
  • 求计算结果

没有提交,我编几个样例把。
【输入样例】:

(((1)))
(((1+1)))
1+4/2*3+4
1+4/(2*3)+4
1+120/(20*3)+1

【输出样例】:

1
2
11
5
4

【中缀表达式结果】

1.
1.1.+
1.4.2./3.*+4.+
1.4.2.3.*/+4.+
1.120.20.3.*/+1.+

solution

【中缀表达式转后缀:】

1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符(包括左括号),则我们将其放入到栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
ps)对于两位的数字,在转为中缀的时候记得加个点,方便求值

【后缀表达式求值:】

1)遇到数字时,将数字压入堆栈
2)遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次栈顶元素 op 栈顶元素),并将结果入栈。
#include<bits/stdc++.h>
using namespace std;
int Youxianji(char op){
if(op=='*'||op=='/')return 2;
if(op=='+'||op=='-')return 1;
if(op=='(')return 0;
}
void ToHouzhui(string str, string& ans){
stack<char>stk;
ans = "";
int i =0;
while(i<str.size()){
if(str[i]>='0' && str[i]<='9'){
//ans += str[i];
int t = 0;
while(str[i]>='0' && str[i]<='9'){
t = t*10+str[i]-'0';
i++;
}
ans += to_string(t)+".";
}else{
if(stk.empty()){
stk.push(str[i]);
}else if(str[i]=='('){
stk.push(str[i]);
}else if(str[i]==')'){
while(stk.top()!='('){
ans += stk.top();
stk.pop();
}
stk.pop();
}else{
while(Youxianji(stk.top())>=Youxianji(str[i])){
ans += stk.top();
stk.pop();
if(stk.empty())break;
}
stk.push(str[i]);
}
i++;
}
}
while(stk.size()){
ans += stk.top();
stk.pop();
}
}
int culate(string str){
stack<int>stk;
int ans = 0, i = 0;
while(i < str.size()){
if(str[i]>='0'&&str[i]<='9'){
//stk.push(str[i]-'0');
int t = 0;
while(str[i]!='.'){
t = t*10+str[i]-'0';
i++;
//cout<<t<<endl;
}
i++;
//cout<<t<<endl;
stk.push(t);
}else{
int a = stk.top(); stk.pop();
int b = stk.top(); stk.pop();
int tmp;
if(str[i]=='+')tmp = b+a;
if(str[i]=='-')tmp = b-a;
if(str[i]=='*')tmp = b*a;
if(str[i]=='/')tmp = b/a;
stk.push(tmp);
i++;
}
}
return stk.top();
}

int main(){
string s,t;
while(cin>>s){
ToHouzhui(s,t);
//cout<<t<<endl;
cout<<culate(t)<<endl;
}
return 0;
}


标签:中缀,int,top,stk,while,str,ans,求值,表达式
From: https://blog.51cto.com/gwj1314/6044466

相关文章

  • Lambda表达式
    Lambda表达式可以简单的理解为可传递的的匿名函数的一种方式,可以使用在函数式接口上,包含参数列表,函数体,返回类型,异常列表基本语法://标准写法(parameters)->{expre......
  • 19正则表达式
      用于定义各种模糊筛选规则。  查找空行:    指定开头是a,结尾是bash,中间任意:      查特殊字符出现文件,需要使用转义字符,并且用’‘引起来。......
  • Jmeter-后置处理器-json提取器(相对路径${..date})与正则提取器(万能表达式.*?)
    1、json提取器-相对路径以及多个参数(写默认值)  如果你的响应体为json格式,那么优先选用json提取器如果想要提前请求中内容、响应的头部内容、或者响应体格式非json格......
  • 正则表达式-(3)分组与引用
    括号在正则中的功能就是用于分组。简单来理解就是,由多个元字符组成某个部分,应该被看成一个整体的时候,可以用括号括起来表示一个整体,这是括号的一个重要功能。其实用括号括......
  • 正则表达式&&Java应用
    正则表达式​​10分钟快速掌握正则表达式​​​​Regex测试网站​​​​正则表达式30分钟入门教程​​正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法......
  • corn表达式
    corn表达式的值所处的位置不同,对应不同的时间单位,从左到右依次是:秒分时日月周年(其中年可以省略不写;周表示周一、周二等,与日相矛盾,使用时注意)*表示每一时间单位都......
  • JvavScript与java中的正则表达式的区别
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scripttype="text/javascript">/*1.JavaScript是部分匹......
  • Java中Lambda表达式基础及使用
    目录一、举例说明1、无参无返回1.1定义一个接口1.2接口实现类1.3测试类2、有参无返回代码示例3、有参有返回二、简单事项1、省略模式2、注意事项三、L......
  • 正则表达式基础
    <spanstyle="font-size:18px;">packagecn.itcast.test;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassDemo1{publicstaticvoidma......
  • python新手常见问题一:乱用表达式
    在函数参数中乱用表达式作为默认值Python允许给一个函数的某个参数设置默认值以使该参数成为一个可选参数。尽管这是这门语言很棒的一个功能,但是这当这个默认值是可变对象(mu......