美文网首页
表达式计算c++

表达式计算c++

作者: 小白之白小明 | 来源:发表于2017-03-02 13:45 被阅读211次

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

用到了栈的知识,数字建一个栈,符号建一个栈。然后根据符号先后顺序比较,出栈入栈进行计算。

#include<iostream>
#include<string>
#include<stack>
using namespace std;  
char s[110];  
char pre[7][7]={  
    {'>','>','<','<','<','>','>'},  
    {'>','>','<','<','<','>','>'},  
    {'>','>','>','>','<','>','>'},  
    {'>','>','>','>','<','>','>'},  
    {'<','<','<','<','<','=','0'},  
    {'>','>','>','>','0','>','>'},  
    {'<','<','<','<','<','0','='}};  
char procede(char a,char b)  
{  
    int i,j;  
    switch(a)  
    {  
        case'+':i=0;break;  
        case'-':i=1;break;  
        case'*':i=2;break;  
        case'/':i=3;break;  
        case'(':i=4;break;  
        case')':i=5;break;  
        case'#':i=6;break;  
    }  
    switch(b)  
    {  
        case'+':j=0;break;  
        case'-':j=1;break;  
        case'*':j=2;break;  
        case'/':j=3;break;  
        case'(':j=4;break;  
        case')':j=5;break;  
        case'#':j=6;break;  
    }  
    return pre[i][j];  
}     
int operate(int m,int n,char x)  
{  
    if(x=='+')  
    return m+n;  
    if(x=='-')  
    return n-m;  
    if(x=='*')  
    return m*n;  
    if(x=='/')  
    return n/m;  
}  
int main()
{
    int k,y;
    stack <int> shu;
    stack <char> fu;
    char c;
    char ss[2]="#";
    fu.push('#');
    cin>>s;
    strcat(s,ss);
    c=s[0];
    k=1;
    while(c!='#'||fu.top()!='#')  
    {  
        y=0;  
        if(c>='0'&&c<='9')  
        {  
            while(c>='0'&&c<='9')  
            {  
                y=y*10+(c-'0');  
                c=s[k++];  
            }  
            shu.push(y);  
        }
        else
        {
            switch(procede(fu.top(),c))  
            {  
                case'<':  
                    fu.push(c);  
                    c=s[k++];  
                    break;  
                case'=':  
                    fu.pop();  
                    c=s[k++];  
                    break;  
                case'>':  
                    char x=fu.top();fu.pop();  
                    int m=shu.top();shu.pop();  
                    int n=shu.top();shu.pop();  
                    shu.push(operate(m,n,x));  
                    break;    
            } 
        }
    }
    cout<<shu.top();
    system("pause");
    return 0;
}```

相关文章

  • 表达式计算c++

    问题描述输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。输入格式输入一行,包含一个表达式。...

  • day06-逆波兰表达式的计算器

    目标:完成一个逆波兰表达式的计算器(分为两个步骤)计算后缀表达式:中缀表达式转成后缀表达式: 1.计算后缀表达式:...

  • 深度透析逆波兰表达式

    逆波兰表达式 1、概念 标准四则运算表达式---中缀表达式 计算机采用一种计算,变成后缀表达式: 2、计算机进行转...

  • 前缀中缀和后缀表达式

    中缀 人类正常使用的计算表达式即为中缀表达式比如:( 1 + 2 ) * 3 - 4 前缀 前缀表达式的计算逻辑为...

  • [堆栈] 前, 中, 后缀表达式

    将中缀表达式转换成后缀表达式(逆波兰式), 便于计算机的计算.

  • JAVA计算表达式

    JAVA计算数字表达式的值: 利用JS来计算: 利用栈来计算 参考 栈计算表达式:将所有的数字放入List中(优先...

  • 2020徐州C++初级班,开启探索计算机科学之路

    课程内容: 1、C++输入输出机制; 2、C++基本数据类型; 3、C++运算符和表达式; 4、C++顺序结构; ...

  • 逆波兰计算器

    中缀表达式转换成后缀表达式 后缀表达式的计算 逆波兰计算器 先挖坑,学年设计之后再来填坑。

  • C++\CLI中的lambda表达式

    可以在C++\CLI中使用lambda表达式,但有一个限制,不能捕获C++\CLI托管类型,只能捕获C++的基本类...

  • 新年计划

    博客 计算广告 高级编程 c++

网友评论

      本文标题:表达式计算c++

      本文链接:https://www.haomeiwen.com/subject/nowhgttx.html