简单计算器 (Stack)

题目:
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
解题思路:
使用栈来实现,将中缀表达式转换为后缀表达式。
转换规则如下:
1,如果是数字直接输出(输出到栈中)
2,如果是运算符号则判断其与栈顶的优先级,是右括号或优先级不高于栈顶符号则
栈顶元素依次出栈输出,并将当前符号进栈。
代码:

#include<iostream>
#include<stack>
#include<string.h>
#include<stdio.h>
using namespace std;
int Rank(char a)
{
    if(a=='(')
       return 4;
    else if(a=='*' || a=='/')
        return 3;
    else if(a=='+' || a=='-')
        return 2;
    return 0;
}//优先级,左括号最高,乘除高于加减
int main()
{
    stack<double>data;
    stack<char> point;
    char a[201];
    int i,t;
    while(gets(a)!=NULL && strcmp("0",a))
    {
        i=t=0;
        while(a[i] || !point.empty())
        {
            if(a[i]==' ')
                i++;
            else if(a[i]>='0' && a[i]<='9')//如果是数字直接输出到名为data的栈中
            {
                t=t*10+a[i]-'0';
                i++;
                if(!(a[i]>='0' && a[i]<='9'))
                {
                    data.push(t);
                    t=0;
                }
            }
            else if(point.empty() || Rank(a[i])>Rank(point.top())||point.top()=='('&& a[i]!=')')//如果运算符(point)栈为空,无需后面的比较直接入栈,
            {                                                                                   //或者当前运算符优先级大于栈顶运算符优先级入栈
                point.push(a[i]);                                                               //如果入栈了一个左括号,则下一个运算符无需比较优先级直接入栈
                i++;
            }
            else if(point.top()=='(' && a[i]==')')
            {
                point.pop();
                i++;
            }
            else    //其他情况为两个数字进行运算
            {
                double fir,sec;
                switch(point.top())
                {
                    case '+' :
                    {
                        fir=data.top();
                        data.pop();
                        sec=data.top();
                        data.pop();
                        data.push(fir+sec);

                    }
                    break;
                    case '-' :
                    {
                        fir=data.top();
                        data.pop();
                        sec=data.top();
                        data.pop();
                        data.push(sec-fir);
                    }
                    break;
                    case '*':
                    {
                        fir=data.top();
                        data.pop();
                        sec=data.top();
                        data.pop();
                        data.push(fir*sec);
                    }
                    break;
                    case '/':
                    {
                        fir=data.top();
                        data.pop();
                        sec=data.top();
                        data.pop();
                        data.push(sec/fir);
                    }
                    break;
                }
                point.pop();
            }

        }
        printf("%.2f\n",data.top());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/gee_zer/article/details/81215342