c++中的堆栈仿真
Stack Simulation In C++
我编写了这个程序来模拟堆栈。第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();
}
- 第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
, pop
或get
对象。你可以添加其他功能,如检查堆栈是否为空,或者它包含多少元素,但这是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
数据成员)。
然而前面的答案可能是你问题的正确答案:你的类做了太多的事情。构造函数的作用肯定不是清除屏幕并要求用户输入一些数据。
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- c++中的堆栈仿真