堆栈实现中的无限循环c ++

时间:2014-03-13 11:32:56

标签: c++ while-loop

这是我的第一个数据结构程序。我正在使用带有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];

        }
    }

   }

}

2 个答案:

答案 0 :(得分:5)

您永远不会初始化a,因此您的程序有未定义的行为。具体来说,while (a != 4)行执行a的左值到右值转换,而其值是不确定的,C ++标准明确指出4.1节中的未定义行为。

然而,我怀疑这是导致手头的问题。实际上,除非优化器只是优化了所有代码,否则程序通常应该按预期运行;只有在第一个循环中a == 4出现问题时才会这样做。这并不能使代码可以接受,但可能还有更多。

我怀疑问题是您使用top来表示超过元素数量的一个。当你有零元素时,你指向第一个元素;当你有一个,你指向第二个,等等。这意味着你指向第一个未使用的元素。

但是,在pushpop函数中,您首先更改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将具有它开头的任何值(代码中未定义),并且您将循环使用该不变的值。

输入调用失败的典型方法包括

  • control + D (在* nix系统上)
  • control + Z (在Windows系统上)
  • 从耗尽的管道或文件重定向输入

也可能有其他原因导致输入失败。