题目:
我们人类习惯于书写“中缀式”,如 3 + 5 * 2 ,其值为13。 (p.s. 为什么人类习惯中缀式呢?是因为中缀式比后缀式好用么?)
而计算机更加习惯“后缀式”(也叫“逆波兰式”,Reverse Polish Notation)。上述中缀式对应的后缀式是: 3 5 2 * +
现在,请对输入的后缀式进行求值。
输入格式:
在一行中输入一个后缀式,运算数和运算符之间用空格分隔,运算数长度不超过6位,运算符仅有+ - * / 四种。
输出格式:
在一行中输出后缀式的值,保留一位小数。
输入样例:
3 5.4 2.2 * +
输出样例:
14.9
分析
实现
Python实现
这道题非常适合用stack这种先进后出的数据结构,用Python实现很方便。
# 3 5.5 + 2
exp=input().split()
# print(exp)
ls=list()
def Cal(a,b,i):
if i=="+":
return a+b
elif i=="-":
return a-b
elif i=="*":
return a*b
else:
return a/b
for i in exp:
if i in "+-*/":
a=ls.pop()
b=ls.pop()
ls.append(Cal(b,a,i))
else:
ls.append(float(i))
print("{:.1f}".format(float(ls.pop())))
C++实现
#include <iostream>
#include <stack>
#include <string.h>
using namespace std;
float Cal(float b,float a,char* c){
if(*c=='+') return b+a;
else if(*c=='-') return b-a;
else if(*c=='*') return b*a;
else return b/a;
}
int main(){
// string str;
// getline(cin,str);
char s[100];
int i=0;
stack<float> st;
while(1){
char tmp=getchar();
if(tmp!='\n'){
s[i++]=tmp;
}
else break;
}
char* p;
const char* delim=" ";
p=strtok(s,delim);
while(p){
// cout<<p<<endl;
if(*p=='+'||*p=='-'||*p=='*'||*p=='/'){
float a=st.top();
st.pop();
float b=st.top();
st.pop();
st.push(Cal(b,a,p));
}
else
st.push(stof(p,0));
p=strtok(NULL,delim);
}
// cout<<st.size();
while(!st.empty()){
printf("%.1f",st.top());
st.pop();
}
return 0;
}
strtok()函数
分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。在头文件#include<string.h>中。