Я реализовывал стек, используя динамический массив.Моя идея проста: я хочу, чтобы пользователь ввел желаемую длину, а затем создал стек с этой длиной.Затем он / она может нажать, выдать целое число;увидеть верхнее и максимальное значение (для целей отладки);проверьте, является ли он полным или пустым (также для отладки).Он / она может толкать до тех пор, пока стек не заполнится, затем должен выдвинуться, он / она может выдвинуться до тех пор, пока он не опустеет, а затем должен нажатьЯ использую do while и switch, чтобы облегчить отладку и манипулирование.Но когда я начал тестировать, мой главный атрибут моего стекового класса оставался 0, сколько раз я когда-либо толкал или выдавливал.Я пытался найти ошибку, но все еще не нашел ее.
Вот мой код:
#include <cstdio>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class Stack {
int top;
int max; // max index
int *data;
public:
Stack(int length);
int isEmpty();
int isFull();
int push(int n);
int pop();
int getTop(void);
int getMax(void);
~Stack(void);
};
Stack::Stack(int length){
top = 0;
max = length;
data = new int[length+1];
}
int Stack::isEmpty(void){
return top==0;
}
int Stack::isFull(void){
return top==max;
}
int Stack::push(int n){
if(!isFull()){
data[++top] = n;
return 1;
}
else return 0;
}
int Stack::pop(void){
if(!isEmpty()){
return data[top--];
}
else return -911; //rare and indicative number
}
int Stack::getTop(void){
return top;
}
int Stack::getMax(void){
return max;
}
Stack::~Stack(void){
delete[] data;
}
int main(void){
int length = 0;
cout << "Enter stack's length': "; cin >> length;
Stack list(length);
char lock;
do{
cout << "1. push" << endl;
cout << "2. pop" << endl;
cout << "3. show top index" << endl;
cout << "4. show max index" << endl;
cout << "5. isFull?" << endl;
cout << "6. isEmpty?" << endl;
cout << "0. Quit" << endl;
scanf("%d", &lock);
switch(lock){
case 1:
int temp;
cout << "Enter an integer: ";
cin >> temp;
printf(list.push(temp)?"success\n":"fail\n");
break;
case 2:
cout << "Top's data: " << list.pop() << endl;
break;
case 3:
cout << list.getTop() << endl;
break;
case 4:
cout << list.getMax() << endl;
break;
case 5:
printf(list.isFull()?"True\n":"False\n");
break;
case 6:
printf(list.isEmpty()?"True\n":"False\n");
break;
case 0: break;
default:
cout << "Not an available work!" << endl;
}
} while (lock!= 0);
return 0;
}