这是我的第一个数据结构程序。我正在使用带有push,pop和initialize函数的数组实现一个简单的堆栈。我得到一个无限循环作为输出。你能告诉我为什么会这样吗?
#include<iostream>
using namespace std;
# define SIZE 6
class stack{
public:
void init();
void push(int i);
int pop();
int top;
int stck[SIZE];//bydefault private
};
void stack::init()
{
top=0;
return;
}
void stack::push(int i)
{
if(top==SIZE)
{
cout<<"stack is full";
return;
}
else
{
top=top+1;
stck[top]= i;
return;
}
}
int stack::pop()
{
if(top==0)
{
cout<<"stack is empty. \n";
return 0;
}
else
{
top = top-1;
return(stck[top-1]);
}
}
int main()
{
stack stack1;
stack1.init();
int a;
int m;
while(a!=4)
{
cout<<"1. push 2. pop 3.display 4.exit .\n";
cin>>a;
if(a==1){
cout<< "enter value";
cin>>m;
stack1.push(m);
}
if(a==2)
{
cout<<"popped"<< stack1.pop();
}
if(a==3)
{
for(int k=0; k<=stack1.top;k++)
{
cout<<stack1.stck[k];
}
}
}
}
答案 0 :(得分:5)
您永远不会初始化a
,因此您的程序有未定义的行为。具体来说,while (a != 4)
行执行a
的左值到右值转换,而其值是不确定的,C ++标准明确指出4.1节中的未定义行为。
然而,我怀疑这是导致手头的问题。实际上,除非优化器只是优化了所有代码,否则程序通常应该按预期运行;只有在第一个循环中a == 4
出现问题时才会这样做。这并不能使代码可以接受,但可能还有更多。
我怀疑问题是您使用top
来表示超过元素数量的一个。当你有零元素时,你指向第一个元素;当你有一个,你指向第二个,等等。这意味着你指向第一个未使用的元素。
但是,在push
和pop
函数中,您首先更改top
,然后才能访问堆栈,但就好像您没有更改它一样:< / p>
top = top + 1;
stck[top] = i;
当您的堆栈为空时,这会将top
设置为1,然后访问stck[1]
。同时,stck[0]
未设置。弹出时,你的反面是:
top = top - 1;
return stck[top-1];
这会将top
设置为0,但会返回stck[-1]
,这超出范围。
我怀疑如果你将SIZE
值推入堆栈,你最终会覆盖不相关的内存,这可能会导致各种麻烦。我仍然没有看到无限循环如何跟随,但鉴于行为未定义,它肯定是一个可能的结果。
(另一种方法是你在某个时候输入一个不是数字的东西。看你从未检查你的输入是否成功,如果a != 4
而你输入的内容无效,所有进一步的读取都会失败,{{{ 1}}将保持不等于4.您可以通过将a
更改为
while
在这种情况下,如果输入的内容无效且while (a != 4 && std::cin)
进入非良好状态,则循环(以及程序)将结束。)
答案 1 :(得分:2)
您只有一个循环,根据用户输入终止。
如果cin>>a
失败,a
将具有它开头的任何值(代码中未定义),并且您将循环使用该不变的值。
输入调用失败的典型方法包括
也可能有其他原因导致输入失败。