题3-3 后缀式计算
题目描述
输入一个后缀表达式,试计算该表达式的结果。
规定:后缀表达式的长度不超过一行(80个字符),以$作为输入结束,操作数、操作符之间用空格分隔,操作符只可能有+、-、*、/四种运算,操作数均为整数且运算过程不超出int型范围。例如:234 34 + 2 * $。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行上输入不超过80个字符的合法的后缀表达式,数据之间以一个空格分隔。
输出格式:
对于每组测试,输出后缀表达式的计算结果,结果保留两位小数。
输入样例:
234 34 + 2 * $
1 2 - 3 + 4 * 5 / $
1 2 3 * / 4 5 + - $
输出样例:
536.00
1.60
-8.83
出处:
数据结构题集 ISBN:9787115234902 3.4
解题代码
#include<iostream>
using namespace std;
typedef float ElemType;
struct stackNode{
ElemType data;
stackNode *next;
};
class Stack{
public:
ElemType Top();
void Pop();
void Push(ElemType);
void InitStack();
bool Empty();
void Clear();
private:
stackNode *top;
};
void Stack::InitStack()
{
this->top = new stackNode();
top->next=NULL;
}
ElemType Stack::Top()
{
if(!this->Empty()){
return top->next->data;
}
return ' ';
}
void Stack::Pop()
{
stackNode *p=top->next;
if(!this->Empty()){
top->next=top->next->next;
free(p);
}
}
void Stack::Push(ElemType data){
stackNode *p = new stackNode();
p->data=data;
p->next=top->next;
top->next=p;
}
bool Stack::Empty(){
if(top->next!=NULL){
return false;
}
return true;
}
void Stack::Clear(){
stackNode *p;
while(top->next!=NULL){
p=top->next;
top->next=p->next;
free(p);
}
}
float changeStr(string str)
{
float ans=0;
for(int i=0;i<str.size();i++){
ans=ans*10+(str[i]-'0');
}
return ans;
}
float getAns(Stack *stack,string opt){
float a,b;
a=stack->Top();
stack->Pop();
b=stack->Top();
stack->Pop();
if(opt=="+"){
return a+b;
}else if(opt=="-"){
return b-a;
}else if(opt=="*"){
return a*b;
}else if(opt=="/"){
return b/a;
}
}
int main()
{
int flag=0;
string str,opt;
Stack stack;
stack.InitStack();
while(cin>>str){
float a,b;
if(str=="$"){
if(flag==0){
printf("%.2f",stack.Top());
flag=1;
}else{
printf("\n%.2f",stack.Top());
}
stack.Clear();
}else{
if(str=="+"||str=="-"||str=="*"||str=="/"){
float ans = getAns(&stack,str);
stack.Push(ans);
}else{
float ans = changeStr(str);
stack.Push(ans);
}
}
}
}
思路
就是输入后将数字存储,遇到运算符就出栈,运算完成再入栈,最终的结果就是答案。