表达式计算

来源:互联网 发布:马伯乐了知 编辑:程序博客网 时间:2024/06/06 02:47

表达式计算对于我们人来说,喜欢通过中缀表达式来计算,而计算机则不一样,需要通过后缀表达式来计算,首先通过实例来介绍一下中缀表达式和后缀表达式
例子
中缀表达式: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;}
原创粉丝点击