算法与数据结构——栈实现表达式求值

题目:

 

 

代码:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int N=100010;
//处理输入,跳过空格
string split(string s)
{
    string ss;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]==32) 
            continue;
        
        ss+=char(s[i]);
    }
    return ss;
}
//判断括号是否缺少
bool ck1(string s)
{
    int cnt=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='(') cnt++;
        else if(s[i]==')') cnt--;
    }
    return cnt==0;
}
//判断加减乘除不在首位或末位或加减乘除的上一位是加减乘除,若满足则缺少操作数
bool ck2(string s)
{
    for(int i=0;i<s.size();i++)
        if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')
            if( i==0 || i==s.size()-1 || i && (s[i-1]=='+'
               ||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'))
                return 0;
    
    return 1;
}
//乘除法优先,括号和加减都是1,乘除是2
int pri(char ch)
{return ch=='*'||ch=='/'?2:1;}

char ch[N];
int cnt;
//实现后缀表达式
string cg(string s)
{
    string ss;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='0'&&s[i]<='9')//数字位整合
        {
            ss+=char(s[i]);
        }
        else//符号位
        {
            if(s[i]=='(')
            {
                ch[cnt++]='(';
            }
            else if(s[i]==')')
            {
                while(ch[cnt-1]!='(')
                {
                    ss+=ch[--cnt];
                }
                cnt--;
            }
            else
            {
                char c = char(s[i]);
                if(cnt > 0 && pri(c) <= pri(ch[cnt-1]))//判断优先级
                    while(cnt>0 && ch[cnt-1] != '(')
                        ss+=ch[--cnt];
                ch[cnt++]=c;
            }
        }
    }
    while(cnt>0)
        ss+=ch[--cnt];
    return ss;
}
//加减乘除
int op(int x,int y,char ch)
{
    if(ch=='+') return x+y;
    else if(ch=='-') return x-y;
    else if(ch=='*') return x*y;
    else return x/y;
}

int a[N],ct;
//计算
int op(string s)
{
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='0'&&s[i]<='9')//数字位
        {
            a[ct++]=s[i]-'0';//转化为数字
        }
        else//符号位
        {
            int x=a[ct-2],y=a[ct-1];//符号左右
            ct-=2;//更新下标
            a[ct++]=op(x,y,char(s[i]));//计算结果
        }
    }
    return a[0];
}

int main()
{
    string s;
    getline(cin,s);

    s=split(s);

    if(!ck1(s)){
        cout<<"ERROR:缺少括号";
        return 0;
    }

    if(!ck2(s)){
        cout<<"ERROR:表达式缺操作数";
        return 0;
    }

    string ss=cg(s);
    cout<<ss<<endl;

    cout<<op(ss);

    return 0;
}

参考:栈实现表达式求值 - 清梦韶华 - 博客园 (cnblogs.com)

 

 

posted @ 2022-11-14 19:25  sodamate  阅读(21)  评论(0编辑  收藏  举报