c++中的堆栈仿真

Stack Simulation In C++

本文关键字:仿真 堆栈 c++      更新时间:2023-10-16

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

问题在这个模块:

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();
}

完整程序代码如下:

 // Stack Simulation
 #include <iostream>
 #include <conio>
 #include <string>
 using namespace std;
 class stack {
     private:
     string *tos; // Top of stack pointer  
     string *data;
     int size;
     public:
     stack(void);
     ~stack(void);
     void menu(void);
     void push(void);
     void pop(void);
     void display(void);
 };
 stack::stack(void) {
     cout << "Stack SimulationnPress 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();
 }
 stack::~stack(void) {
     clrscr();
     cout << "Press Enter to exit simulation.n";
     getch();
 }
 void stack::menu(void) {
     int x;
     do {
         cout << "1.Pushn2.Popn3.Displayn4.ExitnEnter your choice:";
         cin >> x; 
         switch (x) {
             case 1:
             push();
             break;
             case 2:
             pop();
             break;
             case 3:
             display();
             break;
             default:
             cout << "Invalid input. Inputs must be one of these numbers: 1,2,3. Try Again.n";
             break;
         }
     } while (x!=4); 
 }
 void stack::display(void) {
     clrscr();
     if (data[0]=="") {
         cout << "Stack is empty. Press Enter to return to main menu.";
         getch();
     } else {
         cout << "Contents of stack:nn";
         for (int k=size-1;k>-1;k--) {
             if (!(data[k]=="")) {
                 cout << data[k] << endl;
             }
         }
         cout << "nnPress Enter to return to main screen.";
         getch();
     }
     clrscr();
 }
 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();
 }
 void stack::pop(void) {
     clrscr();
     if (data[0]!="") {
         cout << "The data popped is " << *tos;
         *tos="";
         tos--;
         cout << "nPress Enter to return to main menu.";
         getch();
     } else {
         cout << "Stack is empty.nPress Enter to return to main menu.";
         getch();
     }
     clrscr();
 }
 void main(void) {
     stack demo;
     demo.menu();
 }   
  1. 第87行没有按预期运行。谁能指出正在发生的问题?

不完全是,因为你没有说你希望你的函数做什么,因为你的堆栈不仅仅是一个堆栈。我马上就会解决这个问题

  • 和第94行是正确的方式来增加指针的地址1即在数组中的下一个元素?
  • 是的。


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

    当你创建一个堆栈时,你这样做,

    stack::stack(void) {
        cout << "Stack SimulationnPress 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();
    }
    

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

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

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

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

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

    构造函数失去了一些权重。现在它做了一些非常简单的事情,它用外部提供给它的一定大小初始化堆栈。没有必要将每个元素都初始化为空字符串,当用户向堆栈上压入一些东西时,才初始化元素。

    现在你必须把这些额外的东西放在它们正确的位置,看起来像,

    int main( int argc, char **argv ) {
        cout << "StackSimulationnPress Enter To Continue." << endl;
        getch();
        clrscr();
        int size;
        cout << "Enter size of stack: ";
        cin >> size;
        stack myStack{ size };
        // ...
    }
    

    现在我不想为你写代码了。你去吧。

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

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

    第87行没有像您所说的那样工作,可能是因为您在Stack的构造函数中定义了一个局部变量int size,并且它可能不是您想要的(您可能想要设置size数据成员)。

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