Мы пытаемся создать программу на 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) почему бы не использовать стек?
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 ++ стека.
Вы на правильном пути здесь. Чтобы отслеживать ваши элементы, вам нужен класс. Что-то вроде:
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;
}
}
если стек заполнен и мы пытаемся что-то в него вставить, то это даст нам ошибку переполнения стека
void IntStack::push()
{
clrscr();
int num;
if(top>=stackSize)
cout<<"stack Overflow"<<endl;
else
{
cout<<"Enter Number=";
cin>>num;
top++;
stackArray[top]=num;
}
}
#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;
}