我们正在尝试创建一个像堆栈一样工作的C ++程序。 以下说明如下: 应该有几种方法:
我们必须使用StackElement
:
struct StackElement {
int digit;
StackElement* predecessor;
};
现在的问题是如何在没有下一个参数的情况下创建push
- 函数,就像普通列表一样。 pop功能也一样。
我们完成了push()
创建一个新的StackElement并pop()
删除了新元素,但是有了2个新元素,这些方法无法正常工作。
全局参数stack0
:
StackElement *stack0 = new StackElement;
这是push
- 函数的代码:
StackElement push(int z){
StackElement *stack1 = new StackElement;
stack1->digit = z;
stack1->predecessor = NULL;
stack0->predecessor = stack1;
stack1 = stack0;
这是pop()
方法:
void pop(){
StackElement *stack1 = new StackElement;
if (stack0!=NULL){
stack1->digit = 0;
stack0->predecessor = NULL; //predecessor = NULL;
}
}
最后是main
方法:
int main()
{
int z;
create();
cout << "Which number to the stack?" << endl;
cin >> z;
push(z);
pop();
print();
return 0;
}
我们考虑过创建一个新的StackElement,它可以作为一个伪&#39; -StackElement,并始终保持在最顶层,以便真正的&#39;顶部的元素永远是伪元素的前身 - 但我们认为这将反对堆栈应该如何工作。
那么你们有什么线索可以继续吗?有什么东西我们只是缺少? 我们非常感谢您提供的任何帮助。
提前致谢, Chrissik(&amp; team)
答案 0 :(得分:3)
1st)为什么不使用std::stack?
第二)堆栈应为LIFO。这意味着你的stack0应该总是最新的...这导致:
StackElement* stack0 = NULL; // until C++11
// StackElement* stack0 = nullptr; // since C++11
void push(int z) {
StackElement *stack1 = new StackElement;
stack1->digit = z;
stack1->predecessor = stack0;
stack0 = stack1;
}
void pop() {
if(stack0) {
StackElement *tmp = stack0;
stack0 = stack0->predecessor;
delete tmp;
}
}
您不需要在pop函数中分配新的。这将导致巨大的内存泄漏。
你的意思是伪称为根元素,有时用于序列。但这里没有必要,因为stack0是根或在这种情况下是结尾(第一个元素和结尾)。
更好的方法是将其封装在一个类中,如他在答案中提到的ryrich。最好的方法是使用C ++ - 给定std::stack。
答案 1 :(得分:1)
你在这里走在正确的轨道上。要跟踪您的元素,您需要一个类。类似的东西:
class Stack{
private:
StackElement *last_data, *first_data;
public:
Stack():last_data(NULL), first_data(NULL){}
void push(int digit);
void pop();
};
推送/弹出功能是Stack
类的一部分。例如,推送:
void Stack::push(int digit)
{
StackElement *p=new StackElement();
p->digit = digit;
if(last_data)
p->predecessor=last_data;
else // empty stack
{
p->predecessor=NULL;
first_data = p;
}
last_data=p;
}
希望这有帮助。
编辑:我将为完整性添加pop函数:
void Stack::pop()
{
if (last_data)
{
StackElement *tp = last_data;
last_data = last_data->predecessor;
delete tp;
}
}
答案 2 :(得分:0)
如果堆栈已满并且我们尝试在其中放入一些东西,那么它将给我们堆栈溢出的错误
void IntStack::push()
{
clrscr();
int num;
if(top>=stackSize)
cout<<"stack Overflow"<<endl;
else
{
cout<<"Enter Number=";
cin>>num;
top++;
stackArray[top]=num;
}
}
答案 3 :(得分:-2)
#include <iostream>
using namespace std;
static int arr[4], top = -1;
//Push function
void push() {
if (top > 3)
cout << "stack overflow ";
else {
top++;
cout << "Enter element to insert : ";
cin >> arr[top];
}
}
//pop function
void pop() {
if (top == -1) {
cout << "Stack underflow ";
} else
top--;
}
//pip function print top variable
void pip() {
if (top == -1) {
cout << "Stack underflow ";
} else
cout << "Top variable :" << arr[top];
}
//main() function
int main() {
int choice;
l1:
cout << "Enter choice : \n 0:push 1:pip 2:pop ";
cin >> choice;
switch (choice) {
case 0:
push();
break;
case 1:
pip();
break;
case 2:
pop();
break;
}
goto l1;
}