【发布时间】:2014-05-05 07:44:48
【问题描述】:
我明天有数据结构“LAB”的期末考试!
我在运行此代码时遇到问题! 此代码计算后缀表达式。它是如此简单..但我不知道为什么当我运行它并尝试划分例如:6/2。它打印出 2 而不是 3!
+ 和 - 和 * 都是正确的,但是除法的问题!您认为我的编译器中的库有问题吗!
我使用 Code::Blocks 和 Visual C++。
你能帮我解决这个问题吗? :(
代码:
#include<iostream>
using namespace std;
#include<math.h>
#include<conio.h>
#define stacksize 6
struct stacktype{
float data[stacksize];
int top;
};
void push( stacktype*s, float d){
if ( s->top < 6) {
s->data[s->top]=d;
s->top++;
}
}
float pop(stacktype*s){
if ( s->top != 0){
s->top--;
return s->data[s->top];
}
return 0;
}
float oper(char symbol, float op1, float op2){
switch (symbol){
case '+': return (op1+op2);break;
case '-':return (op1-op2);break;
case '*':return (op1*op2);break;
case '/':return (op1/op2);break;
default: cout<<"illegal operation.......\n";
}
return 0;
}
int main() {
float op1,op2,symb,value;
char symbol;
stacktype *s;
s= new stacktype;
s->top=0;
cout<<"Enter The Postfix Expression To Evaluate:: \n\n";
cin>>symbol;
while ( symbol != '.') {
if ( symbol == '+' || symbol == '-' || symbol == '*' || symbol == '/'){
op2=pop(s);
op1=pop(s);
value=oper(symbol,op1,op2);
push(s,value);
}
else {
if ( symbol == '0') symb =0 ;
else if ( symbol == '1') symb = 1;
else if ( symbol == '2') symb =2 ;
else if ( symbol == '3') symb =3 ;
else if ( symbol == '4') symb = 4;
else if ( symbol == '5') symb =5 ;
else if ( symbol == '6') symb =6 ;
else if ( symbol == '7') symb =7;
else if ( symbol == '8') symb =8 ;
else if ( symbol == '9') symb =9 ;
push(s,symb);
}
cin>>symbol;
}
value=pop(s);
cout<<"The Value:: \n"<<value<<endl;
return 0;
}
【问题讨论】:
-
你为什么在
return声明之后使用break? -
您首先输入操作数(即“/6 2.”)您必须最后输入操作数(即“6 2 /.”)
-
这只是一个 Switch 语法!
-
还可以在评估后检查堆栈大小,如果表达式正确,则应该只有一个元素。这条规则当然有空表达式的极端情况。
标签: c++ postfix-notation