C++实现简易表达式的计算(操作数为10以内)

1、表达式的表示有三种方式,分别是前缀、中缀和后缀。这里介绍的是中缀的简易表达式的计算。

2、应用的结构是栈结构。对于中缀表达式,需要两个栈,分别是运算符栈operatorStack和操作数栈dataStack。下面是栈的定义。运算符栈存的是char型数据,操作数栈存的是int型数据,所以采用类模板定义。

template <class T>
class Stack{
private:
    int maxSize;
    int top;
    T *p;
public:
    Stack(int m){
        maxSize = m;
        top = -1;
        p = new T[maxSize];
    }
    ~Stack(){
        maxSize = 0;
        top = -1;
        delete []p;
    }
    bool Push(const T item);
    bool Pop(T & item);
    bool Top(T & item);
};
template <class T>
bool Stack<T>::Push(const T item)
{
    if(top == maxSize-1)
    {
        cout<<"栈满溢出"<<endl;
        return false;
    }
    else
    {
        p[++top] = item;
        return true;
    }
}
template <class T>
bool Stack<T>::Pop(T & item)
{
    if(top==-1)
    {
        return false;
    }
    else
    {
        item = p[top--];
        return true;
    }
}
template <class T>
bool Stack<T>::Top(T & item)
{
    if(top==-1)
    {
        return false;
    }
    else
    {
        item = p[top];
        return true;
    }
}

3、算法思想

    函数isp( )代表栈内优先级,icp( )代表栈外优先级。

    依次读入表达式中的每个字符,若是操作数,则进dataStack;

    若是运算符s1,则和operatorStack中的栈顶元素s2做比较再操作。

        若icp(s1)>isp(s2),则运算符s1入栈;
        若icp(s1)<isp(s2),则从dataStack的栈顶弹出两个操作数,与operatorStack的栈顶元素做运算,并将运算结果入dataStack;
        若icp(s1)==isp(s2),则执行operatorStack的栈顶元素出栈。
    直至表达式扫描完毕。

操作符

(

^

*,/,%

+,-

)

isp

1

7

5

3

8

icp

8

6

4

2

1

(1)、定义两个全局的函数isp(char a)和icp(char a)表示栈内外的操作符的优先级

int isp(char a)//栈内运算符
{
    switch(a){
    case '(':
        return 1;
    case '^':
        return 7;
    case '*':
    case '/':
    case '%':
        return 5;
    case '+':
    case '-':
        return 3;
    case ')':
        return 8;
    }
}
int icp(char a)//栈外运算符
{
    switch(a){
    case '(':
        return 8;
    case '^':
        return 6;
    case '*':
    case '/':
    case '%':
        return 4;
    case '+':
    case '-':
        return 2;
    case ')':
        return 1;
    }
}

(2)、定义全局函数calculate(int a, int b, char c),实现当icp(s1)<isp(s2),从dataStack的栈顶弹出两个操作数,与operatorStack中的栈顶元素的运算操作。

int calculate(int a,int b,char c)
{
    int x=1;
    switch(c){
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '*':
        return a*b;
    case '/':
        return a/b;
    case '^':
        //for循环执行乘方操作
        for(int i=0;i<b;i++)
            x = x*a;
        return x;
    case '%':
        return a%b;
    }
}

4、main函数的内容

int main()
{
    cout<<"输入简易表达式"<<endl;
    string s;
    cin>>s;
    Stack<int> dataStack(10);
    Stack<char> operatorStack(10);
    char m;
    for(int i=0;i<s.length();i++)//检查字符串是否合法
    {
        m = s[i];
        if(m>='0' && m<='9') ;
        else if(m=='('||m=='^'||m=='*'||m=='/'||m=='%'||m=='+'||m=='-'||m==')') ;
        else
        {
            cout<<"字符串里有非法字符"<<endl;
            return 0;
        }
    }
    for(int i=0;i<s.length();i++)
    {
        m = s[i];
        if(m>='0' && m<='9')
        {
            dataStack.Push(m-48);
        }
        else
        {
            char n;
            if(operatorStack.Top(n))
            {
                int m1 = icp(m);
                int n1 = isp(n);
                if(m1>n1)
                    operatorStack.Push(m);
                else if(m1<n1)
                {
                    char item;
                    operatorStack.Pop(item);
                    int a1; dataStack.Pop(a1);
                    int a2; dataStack.Pop(a2);
                    int temp = calculate(a2,a1,item);
                    dataStack.Push(temp);
                    i--;
                }
                else
                {
                    char item;
                    operatorStack.Pop(item);
                }
            }
            else
                operatorStack.Push(m);
        }
    }
    char item;
    while(operatorStack.Pop(item))
    {
        int a1; dataStack.Pop(a1);
        int a2; dataStack.Pop(a2);
        int temp = calculate(a2,a1,item);
        dataStack.Push(temp);
    }
    int result;
    dataStack.Pop(result);
    cout<<result<<endl;
    return 0;
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值