一、后缀表达式介绍
后缀表达式的特点就是计算机运算非常方便,需要用到栈;计算机处理过程只需要顺序读入,如果遇到数字,则放入栈中,如果是运算符,则将两个栈中数字取出进行运算;
比如1+2的后缀表达式为12+;
而栈可以把一般的中缀表达式变成后缀表达式,并且计算后缀表达式得出结果,因此此应用在计算器中非常常用;
二、中缀表达式转换成后缀表达式
此方法需要遵循几个规则:
(1)如果读入操作数,则直接放入输出字符串;
(2)如果读入一般运算符如+-*/,则放入堆栈,但是放入堆栈之前必须要检查栈顶,并确定栈顶运算符的优先级比放入的运算符的优先级低;如果放入的优先级较低,则需要将栈顶的运算符放入输出字符串;
(3)如果读入(,因为左括号优先级最高,因此放入栈中,但是注意,当左括号放入栈中后,则优先级最低;
(4)如果读入),则将栈中运算符取出放入输出字符串,直到取出(为止,注意:()不输出到输出字符串;
(5)顺序读完表达式,如果栈中还有操作符,则弹出,并放入输出字符串;
三、计算后缀表达式
规则如下:
(1)如果是操作数,则放入栈中;
(2)如果是操作符,则取出栈中两个操作数,进行运算后,将结果放入栈中;
(3)直到最后栈中只有一个元素,此元素就是计算结果;
四、代码
以下代码是计算器的辅助代码,通过此代码可以快速进行计算。
输入: 四则运算(支持括号)
输出:结果字符串
//后缀表达式 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<strack> using namespace std; int strack[101]; char s[256]; int comp(char s[256]) {//后缀表达式无需判断其算数优先级,因为其运算符顺序都是已经整理好了的,在进行运算时只需遇到运算符局进行操作 int i=0,top=0,x,y; while(i<=stren(s)-2)//由于gets是从1开始读入的,所以需要-1,并且最后面的@是无用的只起停止输入的作用,所以再-1 { swhile(s[i]) { case'+':stack[--top]+=stack[top+1];break;// 因为进行运算时需考虑将其运算后在放入栈中,所以将元素放入后 case'-':stack[--top]-=stack[top+1];break;//将指针下移一位,进行操作,这样就将运算获得数放入指针的位置 case'*':stack[--top]*=stack[top+1];break; case'/':stack[--top]/=stack[top+1];break; default:x=0; while(s[i]!='') x=x*10+s[i++]-'0';//将其转换成数字 stack[++top]=x;//把转换获得数字放入栈中 break; } i++; } return stack[top]; }int main() { printf("input a string (@_over):"); gets(s);//读入一个字符串 printf("result=%d",comp(s)); return 0; }