C++堆栈实现(不能正常工作)

问题描述:

这是前一个线程,我在这个实验室得到了帮助。我的堆栈行为异常,至少可以说,当我添加一个项目到堆栈,稍后打印出来时,它看起来似乎没有添加正确。如果我输入另一个操作数(*,/,+),我总是打印出加号(+)。C++堆栈实现(不能正常工作)

我正在使用堆栈将用户输入,中缀表达式转换为后缀。它似乎工作正常,除了打印结束时在堆栈中的操作数。

#include <iostream>; 
#include <vector> 
using namespace std; 

class DishWell{ 
public: 
    char ReturnFront(){ 
     return Well.front(); 
    } 
    void Push(char x){ 
     Well.push_back(x); 
    } 
    void Pop(){ 
     Well.pop_back(); 
    } 
    bool IsEmpty(){ 
     return Well.empty(); 
    } 
private: 
    vector<char> Well; 
}; 

bool Precidence(char Input, char Stack){ 
    int InputPrecidence,StackPrecidence; 
    switch (Input){ 
     case '*': 
      InputPrecidence = 4; 
      break; 
     case '/': 
      InputPrecidence = 4; 
      break; 
     case '+': 
      InputPrecidence = 3; 
      break; 
     case '-': 
      InputPrecidence = 3; 
      break; 
     case '(': 
      InputPrecidence = 2; 
      break; 
     default: 
      InputPrecidence = 0; 
    } 
switch (Stack){ 
    case '*': 
     StackPrecidence = 4; 
     break; 
    case '/': 
     StackPrecidence = 4; 
     break; 
    case '+': 
     StackPrecidence = 3; 
     break; 
    case '-': 
     StackPrecidence = 3; 
     break; 
    case '(': 
     StackPrecidence = 2; 
     break; 
    default: 
     StackPrecidence = 0; 
} 
if(InputPrecidence>StackPrecidence) return true; 
else return false; 
} 

int main(int argc, char** argv) { 
    DishWell DishTray; 
    char Input; 
    bool InputFlag; 
    InputFlag = true; 
    cout<<"Enter Input, invalid input will terminate"<<endl; 
    while(InputFlag){ 
     cout<<"Input: "; 
     cin>>Input; 
     cout<<endl; 
     if((((Input>='a'&&Input<='z')||(Input>='A'&&Input<='Z'))||Input>='0'&&Input<='9')))//If Digit or Number 
      cout<<Input; 
     if((Input=='*'||Input=='/'||Input=='+'||Input=='-')){//if operand 
      if(DishTray.IsEmpty()) 
       DishTray.Push(Input); 
      else if(Precidence(Input,DishTray.ReturnFront())) 
       DishTray.Push(Input); 
      else if(!Precidence(Input,DishTray.ReturnFront())) 
       cout<<"Output: "<<Input<<endl; 
     } 
     else if(!((((Input>='a'&&Input<='z')||(Input>='A'&&Input<='Z'))||(Input>='0'&&Input<='9')))||((Input=='*'||Input=='/'||Input=='+'||Input=='-')))//if not digit/numer or operand 
      InputFlag = false; 
    } 
    int counter = 0; 
    while(!DishTray.IsEmpty()){ 
     counter++; 
     cout<<counter<<" Element "<<DishTray.ReturnFront()<<endl; 
     DishTray.Pop(); 
    } 
    return 0; 

谢谢MACAIRE贝尔

您的循环调用front(),但后来调用pop_back()。这将始终返回矢量中的第一个元素,直到所有元素都弹出为止,因为您永远不会擦除前一个元素。你ReturnFront()方法也许应该是:

char ReturnBack(){ 
    return Well.back(); 
} 

然后你的循环结尾:

while(!DishTray.IsEmpty()){ 
     counter++; 
     cout<<counter<<" Element "<<DishTray.ReturnBack()<<endl; // will return last element 
     DishTray.Pop(); // actually pop the element printed 
    } 
+0

啊我明白了,我其实已经回到了前一篇文章。认为我的逻辑错了,我回来/前/第一/最后困惑。我应该改变我所有的前台功能,使其恢复正确吗? – Malaken 2011-01-23 02:23:42

难道你不希望看到pop_back返回的值(),而不是放弃,如果它是你目前在做什么?

+1

woot!像魅力一样工作,C++每年都变得不那么痛苦。再次感谢。任何关于我所做比较的建议,他们都有点儿冗长。 (((Input> ='a'&& Input ='A'&& Input ='0'&& Input Malaken 2011-01-23 02:36:49

当你用栈工作,你通常希望能够看到价值在堆栈的顶部。您的课程只允许推送的第一个项目(即堆栈的底部)可见。你的ReturnFront()应该可能返回Well.back(),也许它应该被称为类似ReturnTop()。