gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:59:21 25 4
gpt4 key购买 nike

这是我在同一实验室中获得帮助的上一个线程。我的堆栈行为不正常,至少可以说,当我将一个项目添加到堆栈中以稍后打印时,它似乎没有正确添加。我总是打印出加号'(+),不管我是否输入另一个操作数(*,/,+)。

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

#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;

谢谢你,马凯尔贝尔

最佳答案

您的循环调用 front(),然后调用 pop_back()。这将始终返回 vector 中的第一个元素,直到弹出所有元素,因为您永远不会删除前面的元素。您的 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
}

关于C++ 堆栈实现(不能正常工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com