逆波兰表示法的概念
逆波兰表示法是一种将运算符写在操作数后面的描述程序( 算式 )的方法。举个例子,我们平常用中缀表示法描述的算式( 1 +2 ) * ( 5+
4 ),改为逆波兰表示法之后则是12 + 54 +*。相较于中缀表示法,逆波兰表示法的优势在于不需要括号
实现过程
- 主要使用了栈的数据结构
- 现在我有式子 12 + 54 +* ,1 2先压入栈,遇到运算符后,把 1 2取出来,用遇到的运算符进行运算,1 + 2 = 3;再把3压入里面,在压5 4,遇到运算符+后 取出5 4 进行运算,得 9 ,在把9压入,遇到*后 取出进行运
总结
程序在计算时从算式开头逐一读取字符串,如果字符串是操作数( 数值 )则压人栈,如果是运算符( + 、 -
*)则从栈中取出两个数值算出结果再压入栈,如此循环。 最终栈中剩下的数值便是答案
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int top,S[1000];
void push(int x){//元素入栈
top++;
S[top] = x;
}
int pop(){//元素出栈
top--;
return S[top+1];
}
int main()
{
int a,b,i=0;
top = 0;
char s[100];
while(scanf("%s",s)!= EOF){//输入数据以空格相断 如1 2 * 3 4而不是12*34因为scanf("%s",s)读取不了空格后面的,但是while并没有结束,还可以接着输入
if (s[0] == '+'){
a = pop();
b = pop();
push(a+b);
}
else if(s[0] == '-'){
a = pop();
b = pop();
push(b - a);
}
else if(s[0] == '*'){
a = pop();
b = pop();
push(a*b);
}
else{
push(atoi(s));
printf("%d\n",atoi(s));//把字符串变为数字,传入的字符串首地址
}
}
printf("%d",pop());
return 0;
}