C++_利用栈进行运算符表达式的运算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a7055117a/article/details/46639673

一、基本思路:
将输入的表达式转化成后缀表达式,然后对后缀表达式进行运算

二、将算式转化为后缀表达式:
1、从左向右读取输入的运算符
2、若为数字将数字写入字符串A中
3、若为运算符,与栈顶的运算符比较优先级
3-1、若栈为空或为‘(’则直接压入栈中
3-2、若优先级高直接压入到栈中
3-3、若优先级低或相等则将栈顶的元素弹出并放入到A中,再与新的栈顶元素比较
4、若为括号
4-1、若为(则将其直接要入到栈中
4-2、若为)则从栈顶开始弹出元素依次放入到A中直到遇到(并删除这对括号
5、重复上述步骤直到算式读完

注:因为遇到优先级相同或更高的运算符号时要将栈顶的运算符弹出并加入到字符串中,所以相邻的运算符的数量小于等于二,所以在3-3处最多只需判断两次即可。

三、运算
1、读取刚刚转化成后缀表达式的字符串A,从左向右读取
2、若为操作数,则将其压入到栈B中
3、若为运算符,则读取并弹出栈堆上的两个元素进行运算(先出的元素为第一个元素),将结果压入到栈中成为新的栈顶元素。
4、重复上述两个步骤直到A结束,结果为栈顶元素。

C++代码

Cal.h

#ifndef CAL_H_INCLUDED
#define CAL_H_INCLUDED

#include<stack>
#include <string>
#include<iostream>

using namespace std;

class Cal{
public :
    string tran();//将输入的字符串转化成后缀表达式
    double result();//运算函数
public :
    Cal();
    Cal(string a);
private:
    string exp;
    stack<char> oper;//存放运算符的字符串
};

#endif // CAL_H_INCLUDED


//Cal.cpp

 #include "Cal.h"

double Cal::result()
{
    string fin=tran();
    stack<int> s;
    for(size_t i= 0;i<fin.length();i++)
    {
        if(fin[i]>='0'&&fin[i]<='9')
        {
            s.push(fin[i]-'0');
        }
        else if(fin[i]=='*')
        {
            int a,b;
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            s.push(a*b);
        }
        else if(fin[i]=='-')
        {
            int a,b;
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            s.push(a-b);
        }
        else if(fin[i]=='+')
        {
            int a,b;
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            s.push(a+b);
        }
        else if(fin[i]=='/')
        {
            double a,b;
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            if(b!=0)
                s.push(b/a);
        }
    }
    return s.top();
}


string Cal::tran()
{
    string a;
    for(size_t i = 0; i < exp.length(); i++)
    {
        if(exp[i]>='0'&&exp[i]<='9')
        {
            a+=exp[i];
         }
        else if(exp[i]=='+'||exp[i]=='-')
        {
            if(oper.empty()||oper.top()=='(')
            {
                oper.push(exp[i]);
            }
            else if(oper.top()=='+'||oper.top()=='-')
            {
                a+=oper.top();
                oper.pop();
                oper.push(exp[i]);
            }
            else if(oper.top()=='*'||oper.top()=='/')
            {
                a+=oper.top();
                oper.pop();
                if(!oper.empty())
                {
                    a+=oper.top();
                    oper.pop();
                }
                oper.push(exp[i]);
            }
        }
        else if(exp[i]=='*'||exp[i]=='/')
        {
            if(oper.empty()||oper.top()=='(')
            {
                oper.push(exp[i]);
            }
            else if(oper.top()=='+'||oper.top()=='-')
            {
                oper.push(exp[i]);
            }
            else if(oper.top()=='*'||oper.top()=='/')
            {
                a+=oper.top();
                oper.pop();
            }
        }
        else if(exp[i]=='(')
        {
            oper.push(exp[i]);
        }
        else if(exp[i]==')')
        {
            while(oper.top()!='(')
            {
                a+=oper.top();
                oper.pop();
            }
            oper.pop();
        }
    }
    while(!oper.empty())
    {
        a+=oper.top();
        oper.pop();
    }
    return a;
}

Cal::Cal(string a) : exp(a)
{
}

 #include  < iostream>
 #include "Cal.h"

using namespace std;

int main()
{

    string s;
    while((cin >> s)!=NULL)
    {
        Cal c(s);
    cout << c.result() << endl;
    }

    return 0;
}

“`

注:
1、将字符串转换成数字的时候要减’0’。
2、进行除法运算的时候栈顶的元素为除数,下一个元素才是被除数
3、本代码是参考网上大神代码写的有非常非常多的不足(比如没有对/0进行进一步处理,只能进行int的运算等),仅供初学STL栈的新人参考,如有不足见谅

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页