2014-03-13 42 views
-3

这是我的第一个数据结构程序。我正在实现一个使用数组的push,pop和initialize函数的简单堆栈。我得到一个无限循环作为输出。你能告诉我这是为什么吗?无限循环栈实现C++

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

     } 
    } 

    } 

} 
+3

为什么你认为有无限循环? – Maroun

+0

如果您编写自己的类,则应该使用私有字段和构造函数。 – tgmath

+2

如果你去公众场合,你就不会穿脏兮兮的衬衫,所以请在公共场合介绍格式良好的代码。不鼓励使用宏的常量,而是使用'const'变量。另外,不鼓励使用'using namespace std;',否则会导致名称冲突。 – Flovdis

回答

5

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

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

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

然而,在这两个你pushpop功能,您可以更改top先,然后才访问堆栈,但作为如果你没有改变:

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.你可以通过使更改while解决这个问题是

while (a != 4 && std::cin) 

在这种情况下,如果你输入的东西无效,std::cin进入非正常状态,你的循环(因此程序)将结束。)

+0

斑点。通常你会使用do {} while()循环来计算输入后的用户输入*; *)。 –

+0

虽然(无双关语意思)一个有效的陈述,这是如何使无限循环发生?如果没有(我不知道怎么可能),这应该是一个评论而不是答案。 – mah

+0

@mah:有效的点,我看到你击败了我。 :) –

2

你只有h一个单一的循环,根据用户输入终止。

如果cin>>a失败,a将具有任何开始的值(您的代码中未定义),并且您将循环该不变的值。

用于输入呼叫的典型方式失败包括

  • 按压控制 + d(* nix的系统上)
  • 按压控制 + ž(在Windows系统上)
  • 从用尽的管道或文件重定向的输入

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