【问题标题】:Postfix Evaluation code Using Stack使用堆栈的后缀评估代码
【发布时间】: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


【解决方案1】:

您的代码为我提供了正确的结果:

6
2
/
.
The Value:: 
3

请注意,您使用的是逆波兰表示法,即操作数必须跟在要操作的值之后。

【讨论】:

  • 是的,当我将运算符放在两个操作数之后时它确实有效。我忘了它是一个 POSTFIX 表达式。
猜你喜欢
  • 2012-05-01
  • 2013-05-02
  • 2011-08-03
  • 2015-05-03
  • 1970-01-01
  • 2014-07-01
  • 2011-12-14
  • 2013-10-11
  • 2015-02-14
相关资源
最近更新 更多