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
}
难道你不希望看到pop_back返回的值(),而不是放弃,如果它是你目前在做什么?
woot!像魅力一样工作,C++每年都变得不那么痛苦。再次感谢。任何关于我所做比较的建议,他们都有点儿冗长。 (((Input> ='a'&& Input ='A'&& Input ='0'&& Input Malaken 2011-01-23 02:36:49
当你用栈工作,你通常希望能够看到价值在堆栈的顶部。您的课程只允许推送的第一个项目(即堆栈的底部)可见。你的ReturnFront()应该可能返回Well.back(),也许它应该被称为类似ReturnTop()。
啊我明白了,我其实已经回到了前一篇文章。认为我的逻辑错了,我回来/前/第一/最后困惑。我应该改变我所有的前台功能,使其恢复正确吗? – Malaken 2011-01-23 02:23:42