list — Создание стека в C ++ с помощью Push, Pop и т. д.

Мы пытаемся создать программу на C ++, которая работает как стек.
Даны следующие инструкции:
Там должно быть несколько методов:

Мы должны использовать это определение StackElement:

struct StackElement {
int digit;
StackElement* predecessor;
};

Проблема в том, как создать push-функция без следующего параметра, как это было с обычными списками. То же самое для поп-функции.
Мы достигли push() создать новый StackElement и pop() удалите новый элемент, но с двумя новыми элементами эти методы не работают должным образом.

Глобальный параметр 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, который работал бы как псевдо-StackElement и всегда оставался бы сверху, так что реальный элемент сверху всегда был бы предшественником псевдоэлемента, но мы думаем, что это быть против того, как стек должен работать.

Так у вас, ребята, есть какие-нибудь подсказки о том, как поступить? Есть что-то, что мы просто упускаем?
Мы будем очень благодарны за любую помощь, которую вы можете оказать.

Заранее спасибо,
Криссик (&команда)

1

Решение

1) почему бы не использовать стек?

2) стек должен быть в магазинном порядке. это означает, что ваш стек 0 всегда должен быть самым новым … это приводит к

StackElement* stack0=0;

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

Вам не нужно выделять новый в поп-функции. это закончится огромной утечкой памяти.

То, что вы подразумевали под псевдо, называется корневым элементом и иногда используется в последовательностях, но не обязательно здесь, так как stack0 является корнем или, в данном случае, концом (первый элемент и конец).

Лучшим подходом было бы заключить его в класс, как Райрич упомянул в своем ответе, и лучшим подходом было бы использование заданного c ++ стека.

2

Другие решения

Вы на правильном пути здесь. Чтобы отслеживать ваши элементы, вам нужен класс. Что-то вроде:

class Stack{
private:
StackElement *last_data, *first_data;

public:
Stack():last_data(NULL), first_data(NULL){}
void push(int digit);
void pop();
};

Имейте функции push / 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;
}

Надеюсь это поможет.

Редактировать: я добавлю поп-функцию для полноты:

void Stack::pop()
{
if (last_data)
{
StackElement *tp = last_data;
last_data = last_data->predecessor;
delete tp;
}
}
1

если стек заполнен и мы пытаемся что-то в него вставить, то это даст нам ошибку переполнения стека

void IntStack::push()
{
clrscr();
int num;
if(top>=stackSize)
cout<<"stack Overflow"<<endl;
else
{
cout<<"Enter Number=";
cin>>num;
top++;
stackArray[top]=num;
}
}
0

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

}
-2
По вопросам рекламы [email protected]