C ++中的堆栈模拟

时间:2015-10-04 17:19:44

标签: c++ pointers stack

我写了这个程序来模拟一个堆栈。第87行没有按预期运行。谁能指出正在发生的问题?并且第94行是将指针地址递增1到数组中下一个元素的正确方法吗?请注意,注释中指出了这些行。它位于名为“void stack :: push(void)”的模块中。 提前致谢。

问题出在这个模块中:

for( int id: new int[]{ 331, 341, 366, 367, 391, 396 } ){
    if (s.getPlayer().checkInv().lookFor( id )) {
        s.getPlayer().applyKarth( id );
        break;
    }
}

完整的程序代码如下:

void stack::push(void) {
 clrscr();
 string input;
 bool check=false;
 if (data[0]=="") {
     tos=data;
 } else if (data[size-1]!="") { // This block doesn't function as expected.
     cout << "Stack is full. Press Enter to return to main menu.";
     check=true;
     getch();
 } else { 
     tos++; // Is this the way to increment a pointer's address ?? 
 }
 if (check==false) {
     cout << "Enter data to store in stack: ";
     cin >> input;
     *tos=input;
 }
 clrscr();
}

2 个答案:

答案 0 :(得分:1)

  
      
  1. 第87行无法正常运行。任何人都可以指出正在发生的问题吗?
  2.   

不是真的,因为你没有说出你对函数的期望,也因为你的堆栈不仅仅是堆栈。我马上就会解决这个问题。

  
      
  1. 第94行是将指针地址递增1的正确方法,即数组中的下一个元素是什么?
  2.   

首先,堆栈是容器的对象。周期。

创建堆栈时,执行此操作,

stack::stack(void) {
    cout << "Stack Simulation\nPress Enter To Continue.";
    getch();
    clrscr();
    int size;
    cout << "Enter size of stack: ";
    cin >> size;
    data=new string[size];
    for (int k=0;k<size;k++) { // Nullifying every element of stack
        data[k]="";
    }
    clrscr();
}

您对程序进行了介绍,在用户按任意键后清除屏幕,然后请求用户输入堆栈的大小,然后初始化堆栈。你现在明白了吗?你正在一个容器的构造函数中写一个程序,在错误的地方。

在实际编写代码之前,我们应该考虑如何在程序中分离关注点。你想建立一个堆栈,然后为它创建一个接口

堆栈将以一种只能pushpopget堆栈顶部的对象的方式包含对象。您可以添加其他功能,例如检查堆栈是否为空,或者它包含多少元素,但这些是3个基本功能。

你的构造函数看起来应该更像这样,

stack::stack( int size ) :
    _maxSize( size ), _currentSize( 0 )
{
    data = new string[size];
}

构造函数减轻了一些重量。现在它做了一些相当简单的事情,它从外部为它提供了一定的大小来初始化堆栈。没有必要将每个元素初始化为空字符串,当用户将某些元素推入堆栈时,您将初始化元素。

现在你必须把这些额外的东西放在合适的位置,这看起来像,

int main( int argc, char **argv ) {
    cout << "StackSimulation\nPress Enter To Continue." << endl;
    getch();
    clrscr();

    int size;
    cout << "Enter size of stack: ";
    cin >> size;
    stack myStack{ size };

    // ...
}

现在我不想为你编写代码。你做到了。

在明确定义的模块中使用代码的目标之一是减少出错的可能性。如果您为堆栈编写的代码出现问题,那么您将在为堆栈编写的有限代码范围内找到错误,而不是在菜单代码或输入代码中找到错误。

目前很难理解你所得到的错误是由于堆栈本身的错误还是与堆栈无关的代码造成的。

答案 1 :(得分:0)

第87行无法正常工作如你所说,可能是因为你在Stack的构造函数中定义了一个局部变量int size,它可能不是你想要的(你可能)想要设置size数据成员。)

然而,之前的答案可能是你问题的正确答案:你的班级做了太多事情。 构造函数的作用绝对不是要清除屏幕并要求用户输入一些数据。