表达式计算

表达式计算对于我们人来说,喜欢通过中缀表达式来计算,而计算机则不一样,需要通过后缀表达式来计算,首先通过实例来介绍一下中缀表达式和后缀表达式
例子
中缀表达式:3*(5+2)-3 *6
后缀表达式:3 5 2 + * 3 6 *-

那么转换规则是怎么样的呢?

规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

图解可以自行百度,这里就不多加赘述了

进行表达式计算算法的实现则需要两个栈。存储数字的栈,存储字符的栈。

通过规则将表达式中的数字和字符分别存入两个栈中,如果存储在字符栈中的运算符被输出,则数字栈顶两个数字进行被输出运算符的运算(栈顶第一个数对栈顶第二个数进行操作)并将结果存入数字栈中。直到字符遍历完成,且运算符栈为空。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
using namespace std;
stack<char> stack_ch;//符号栈
stack<int> stack_num; //数值栈
char str[1000]; //输入的中缀表达式
char number[100]; //用来将字符串中的数字变成int型的数组

void js1()//这个函数只接收+-号,+-号等级最低,运算符栈中除了括号外 都可以取出运算
{
    int num1,num2;
    while (stack_ch.top()!='(')  //从运算符栈中取一个运算符 对数值栈顶和次顶元素进行运算
    {
        num1=stack_num.top();//取出一个数
        stack_num.pop();//弹出这个数
        num2=stack_num.top();
        stack_num.pop();
        switch (stack_ch.top())
        {
            case '+':
                num2+=num1;
                break;
            case '-':
                num2-=num1;
                break;
            case '*':
                num2*=num1;
                break;
            case '/':
                num2/=num1;
                break;
         }
         stack_num.push(num2);//将计算结果入数值栈
          stack_ch.pop();//删除已经用过的符号
    }
}
void js2()//只接收  /  *运算符
{
    int num1,num2;
    while (stack_ch.top()=='*' || stack_ch.top()=='/') //栈中只有优先级大于
    {
        num1=stack_num.top();
        stack_num.pop();
        num2=stack_num.top();
        stack_num.pop();
        switch (stack_ch.top())
        {
            case '*':
                num2*=num1;
                break;
            case '/':
                num2/=num1;
                break;
        }
        stack_ch.pop();
        stack_num.push(num2);
    }
}
int main()
{
    int i,k=0,s;
    char c[5]=".";
    stack_ch.push('(');
    gets(str);
    strcat(str,c);//将‘.’连接到表达式字符串中使其判断表达式字符串已读完
    for (i=0;str[i];i++)
    {
        if (str[i]>='0'&&str[i]<='9')//为数字
          {
            number[k++]=str[i];
            continue;
          }
          number[k]='\0'; //变成字符串\0结尾
          if (number[0]!='\0')
          {
          s=atoi(number);//取字符串中首个数字字符所表达的数
          number[0]='\0';
          stack_num.push(s); //将字符串转换成整型,放入数值栈中
          }
          k=0;
            switch(str[i])//‘+-(’这3个符号入js1函数,入js2函数 ,优先级不同要分开计算
            {
                case '+':
                    js1();
                    stack_ch.push('+');
                    break;
                case '-':
                    js1();
                    stack_ch.push('-');
                    break;
                case '*':
                    js2();
                    stack_ch.push('*');
                    break;
                case '/':
                    js2();
                    stack_ch.push('/');
                    break;
                case '(':
                    stack_ch.push('(');
                    break;
                case ')':
                    js1();
                    stack_ch.pop();
                    break;
                case '.':
                    {
                        js1();
                        stack_ch.pop();
                    }
            }
    }
        printf("%d\n",stack_num.top());
        return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36428171/article/details/78406415
今日推荐