四则运算(带括号)的小程序

看了数据结构与算法这本书,用刚学的栈写了一个能实现简单四则运算的小程序
主要是处理括号的问题
大概思路:
中缀表达式-》前缀表达式-》计算

#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
stack<double> Calculate;
int priority(char x)//优先级
{
    switch (x)
    {
    case '+':case '-':  return 1;
    case '*':case '/':  return 2;
    case '(':   return 3;
    case ')':   return 0;
    }
}   
void pop_two(double &t1, double &t2)//出栈2个
{
    t1 = Calculate.top();
    Calculate.pop();
    t2 = Calculate.top();
    Calculate.pop();
}

int main()
{
    cout << "只能计算0到9之间数字的四则运算(),+,-,*,/:" << endl;
    vector<char> Vec;
    stack<char> Stack;
    vector<char> Output;

    double Tem1,Tem2;//临时值
    char Sign;
    while (cin >> Sign )
    {       
        if (Sign == '=')
            break;
        Vec.push_back(Sign);
    }

    //中辍转换为后缀
    for (auto &v : Vec)
    {
        //数字直接进vector
        if (v <= '9'&&v>='0')
        {
            Output.push_back(v);
        }
        //不是数字时
        else
        {
            //情况1:v的优先级大于栈顶元素的优先级时,v入栈
            if (Stack.size() == 0 || priority(v) > priority(Stack.top()) || priority(Stack.top())==3)
            {
                Stack.push(v);
            }
            //情况2:遇到)时候
            else if (priority(v) == 0)
            {
                while (priority(Stack.top()) != 3)
                {
                    Output.push_back(Stack.top());
                    Stack.pop();
                } 
                Stack.pop();
            }
            //情况3:不是)时候,v的优先级小鱼栈顶元素,栈顶元素出栈,直到发现优先级更低的元素(  除非是在处理”)“时候,否则不能移走”(”  )
            else 
            {
                while (Stack.size() != 0 && priority(v) <= priority(Stack.top()) && priority(Stack.top())!=3)
                {
                    Output.push_back(Stack.top());
                    Stack.pop();
                }
                Stack.push(v);
            }

        }
    }
    while (Stack.size() != 0)
    {
        Output.push_back(Stack.top());
        Stack.pop();
    }

    //for (auto &s : Output)
    //{
    //  cout << s << " ";
    //}

    //计算后缀表达式
    for (auto &v : Output)
    {
        //数字时候
        if (v <= '9'&&v >= '0')
        {
            Calculate.push(v-'0');//char变成数字
        }
        //符号时候
        else
        {
            pop_two(Tem1, Tem2);

            switch (v)
            {
            case '+':
                Calculate.push(Tem1+Tem2);break;
            case '*':
                Calculate.push(Tem1*Tem2); break;
            case '-':
                Calculate.push(Tem2 - Tem1); break;
            case '/':
                Calculate.push(Tem2 / Tem1);break;
                //这里出BUG了。。。。我把数字和符号都放在了vector<char>..只能实现整数的四则运算
            }
        }
    }
    cout << Calculate.top();
    return 0;
}

我是直接用了C++里面封装好的stack类,不过C语言实现起来也一样的。
栈有3个重要的函数,出栈,入栈,栈顶提取。

void 
Push(ElementType X,Stack S)
{
    PtrNode TmpCell;
    TmpCell=malloc(sizeof(struct Node));
    if(TmpCell==NULL)
        FalalError("out of space");
    TmpCell->Element=X;
    TmpCell->Next==S->Next;
    S->Next=TmpCell;
}

/*find*/
ElementType
Top(Stack S)
{
    if(!IsEmpty(S))
        return S->Next->Element;
    Error("empty stack");
    return 0;
}


/*delete*/
void
Pop(Stack S)
{
    PtrNode TmpCell;
    if(!IsEmpty(S))
    {
        TmpCell=S->Next;
        S->Next==S->Next->Next;
        free(TmpCell);
    }
    else
        Error("empty stack");

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值