表达式求值运算(逆波兰式)
  Lddcitr3akMp 2023年11月02日 38 0


逆波兰式:中缀表达式,后缀表达式等内容可百度查看。

运算表达式  2+3*(1+2)-6/3

开两个栈,一个存数字,一个存符号。

当 遇到这种情况1:需要先计算后面的内容,再回来计算前面的运算

让符号进栈暂时保存。

还有一种情况2:遇到左括号时,只能进栈等待右括号的到来。右括号到来时,运算整个括号内的内容。


其他情况,都可直接计算。


【代码】

#include<bits/stdc++.h>
using namespace std;
void cal(stack<int> &S1,stack<char> &S2)//进行一次运算
{
    int b=S1.top();S1.pop();
    int a=S1.top();S1.pop();
    char ch=S2.top();S2.pop();
    int ans;
    if(ch=='+')ans=a+b;
    if(ch=='-')ans=a-b;
    if(ch=='*')ans=a*b;
    if(ch=='/')ans=a/b;
    S1.push(ans);
}
bool compare(char l,char r)//l<r  return 1 入栈
{
    if(l=='('||r=='(')return 1;
    if((l=='+'||l=='-')&&(r=='*'||r=='/'))
        return 1;
    return 0;
}
int main()
{
    cout<<"输入表达式:\n";
    string s; cin>>s;
    stack<int>S1;
    stack<char>S2;
    for(int i=0;i<s.length();i++)
    {
        int x=0,flag=0;
        while(s[i]>='0'&&s[i]<='9')
            x=x*10+s[i++]-'0',flag=1;
        if(flag) S1.push(x);
        if(i>=s.length())break;
        if(s[i]==')')//遇 ) 则运算整个括号
        {
            while(S2.top()!='(')
                cal(S1,S2);
            S2.pop();
        }
        else
        {
            while((!S2.empty())&&(!compare(S2.top(),s[i])))//计算
                cal(S1,S2);
            S2.push(s[i]);
        }
    }
    while(!S2.empty())//栈中剩余运算符运算
        cal(S1,S2);
    cout<<S1.top()<<endl;
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  ZydNzX6XOBO2   2023年11月02日   116   0   0 出队C++ci#include
  ZydNzX6XOBO2   2023年11月02日   55   0   0 i++C语言#include
  hXqfRqhGg9it   2023年11月02日   115   0   0 i++堆栈进栈
  5b99XfAwWKiH   2023年11月12日   36   0   0 githubC++openrmcfish
Lddcitr3akMp