表达式求值(栈的操作)

来源:互联网 发布:淘宝聚星台入口在哪里 编辑:程序博客网 时间:2024/05/19 19:12

问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

解题思路:将中缀表达式转化为后缀表达式
转化方法见:http://blog.csdn.net/sgbfblog/article/details/8001651
此题中分别使用符号栈和数值栈进行运算
源代码:

#include<iostream>#include<string>#include<cstring>#include<cmath>#include<stack>#include<stdlib.h>using namespace std;stack<char> str;//符号栈stack<int> num;//数值栈void sym(char ch)//此函数用于将中缀表达式通过栈的操作转化为后缀表达式,并在转化的过程中同时进行后缀表达式的运算{    if(num.size()<2)//数值栈的元素个数小于两个时,仅将符号压入栈中,不进行运算    {        str.push(ch);    }    else    {        if(ch=='+'||ch=='-'||ch==')')//当前运算符为+或-或)时,从栈顶向下进行运算        {            while(str.size()&&str.top()!='(')            {                int num1=num.top();                num.pop();                int num2=num.top();                num.pop();//取出数值栈的前两位数字                if(str.top()=='+')                {                    num.push(num1+num2);                }                else if(str.top()=='-')                {                    num.push(num2-num1);                }                else if(str.top()=='*')                {                    num.push(num1*num2);                }                else if(str.top()=='/')                {                    num.push(num2/num1);                }//将得到的结果压入数值栈                str.pop();//删除符号栈栈顶元素            }            if(ch==')')            {                str.pop();              }//当前符号为)时,必将运算至(停止,所以无需将)压入栈中,并且要将(删除            else            {                str.push(ch);            }//将运算符压入符号栈中           }        else if(ch=='(')        {            str.push(ch);         }//运算符为(时,直接压入符号栈        else if(ch=='*'||ch=='/')        {            while(str.top()=='*'||str.top()=='/')//当前运算符为*或/时,只有*/运算符优先级大于等于此时运算符的优先级            {                int num1=num.top();                num.pop();                int num2=num.top();                num.pop();                if(str.top()=='*')                {                    num.push(num1*num2);                }                else                {                    num.push(num2/num1);                }                str.pop();  //删除栈顶元素            }            str.push(ch); //将当前运算符压入符号栈中        }    }}void sym2()//此函数用于将所有运算符和数值压入栈后,运算并未完成的情况下,完成后缀表达式的运算{    while(str.size())//从栈顶一直向下运算直到符号栈为空    {        int num1=num.top();        num.pop();        int num2=num.top();        num.pop();        if(str.top()=='+')        {            num.push(num1+num2);         }         else if(str.top()=='-')        {            num.push(num2-num1);         }        else if(str.top()=='*')        {            num.push(num1*num2);         }        else if(str.top()=='/')        {            num.push(num2/num1);         }//将结果压入数值栈中        str.pop();//删除符号栈栈顶元素    }}int main(){    int n,i,k=0,Num;//Num用来记录数值    string ch;    char number[10];    getline(cin,ch);    n=ch.length();    for(i=0;i<n;i++)    {        if('0'<=ch[i]&&ch[i]<='9')        {            number[k]=ch[i];            k++;//将数字字符存入number字符串中        }        else        {            number[k]='\0';//在数字字符串末尾插入结束符            if(number[0]!='\0')//区分两个运算符连续出现的情况            {                Num=strtol(number,NULL,10);//数字字符串转化为数字                num.push(Num);//将数值压入数值栈                }            sym(ch[i]);//            number[k]='0';//将此前的结束符更改为非结束符字符,以便之后数值的转化            k=0;                }    }    if('0'<=ch[n-1]&&ch[n-1]<='9')//中缀表达式结尾为数字时,由上面的循环可知,最后一位数值不会被压入数值栈中    {        number[k]='\0';        Num=strt`l(number,NULL,10);        num.push(Num);    }//将结尾数字压入数值栈    sym2();//完成剩余的运算    cout<<num.top()<<endl;    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米5听筒声音小怎么办 红米手机不能开机怎么办 小米5x升级失败怎么办 安卓手机打电话黑屏怎么办 来电话就出黑屏怎么办 oppo手机停留在开机界面怎么办 小米4c死机了怎么办 苹果手机拨打电话时黑屏怎么办 华为畅享6黑屏怎么办 手机拨号键盘变小了怎么办 小米5s手机黑屏打不开怎么办 小米5s黑屏只能开关机怎么办 手机拨号键没了怎么办 华为手机桌面拨号图标不见了怎么办 华为手机拨号图标不见了怎么办 小米4s屏幕显示黑屏怎么办 平板拨号键没了怎么办 华为手机拨号图标没了怎么办 华为荣耀手机进水了怎么办 华为畅享7黑屏怎么办 华为畅玩7x黑屏怎么办 华为手机打电话时黑屏怎么办 三星a8手机黑屏打不开怎么办 华为手机恢复出厂后黑屏怎么办 华为荣耀4c白屏怎么办 华为荣耀6手机信号不好怎么办 华为荣耀8手机音量小怎么办 无法激活触控id怎么办 魅蓝2卡顿怎么办 小米max2玩王者荣耀卡怎么办 小米4玩王者荣耀卡怎么办 华为荣耀7i卡顿怎么办 华为荣耀7卡的怎么办 荣耀8手机有孤独怎么办 红米note4玩游戏卡怎么办 红米note4x玩游戏卡怎么办 华为4c死屏怎么办 华为4c充电很慢怎么办? 华为4c突然死机了怎么办 华为畅玩4c内存不足怎么办 荣耀4c一直亮屏怎么办