面向对象编程 - C ++练习

问题描述 投票:-2回答:2
#include <iostream> 
#include <string> 
#include <cstdlib> 
#define MAX_SIZE 100
int pos=-1;
using namespace std; 

class StackElement { 
private: 
    int data; 
    string name; 
public: 
    StackElement() { 
        data=0;
        name="brak";
        } 
    StackElement(int d, string n) { 
        data = d;
        name = n;
        } 
    void getData() { 
        cin>>data;
        } 
    void getName() {
        cin>>name;
        } 
};
class Stack {
private: 
    int stackSize; 
    StackElement element[]; 
    public:
    Stack() {
        stackSize = 0;
        cout<<"Stack is empty now."<<endl;
        }
    Stack(int s) {
        stackSize = s;
        }
    void push() {
        element[pos+1].getData();
        cout<<"Enter element name:"<<endl;
        element[pos+1].getName();
        pos++;
        }
    void pop() {
        pos--;
        }
    bool isEmpty() {
        if(stackSize==0)
             return true;
        }
    bool isFull() {
        if(pos==MAX_SIZE)
             return true;
        }
 }; 
int main() {
    Stack stack(MAX_SIZE);
    int choice;
    cout<<"1. Push in stack.\n2. Pop from stack.\n3. Display stack.\n4. Exit."<<endl;
    if(stack.isEmpty())
        cout<<endl<<"Stack is empty."<<endl<<endl;
    do { 
        cout<<"Enter your choice"<<endl;
        cin>>choice;
        switch(choice) {
            case 1:
                 cout<<"Enter value:"<<endl;
                 stack.push();
                 break;
            case 2:
                 stack.pop();
                 break;
            case 3:
                cout<<"Soon-to-be displayer"<<endl;
                 break;
            case 4:
                cout<<"Exit"<<endl;
                break;
            default:
                cout<<"Invalid choice"<<endl;
        }
        if(stack.isFull()) {
            cout<<"Stack is full!"<<endl;
            break;
        }
    } while (choice != 4);
return 0; 
}

练习如下:创建类Stack和StackElement。 Stack Element必须包含:2个私有池,一个选项,getter / getters和2个构造函数 - 默认一个,参数化一个(带2个参数)。 Stack必须包含:StackElement类型的元素,私有池大小,一个默认值和一个参数化(一个参数)构造函数,方法push,pop,isEmpty,isFull

我的问题是,当我运行程序时,它在我尝试将一个元素放在堆栈上之后就崩溃了。

c++ oop stack
2个回答
2
投票

push函数以

element[pos+1].getData();

pos是一个全局变量,从-1开始,所以这将是0开始。在尝试从不存在的元素中获取数据之前,您需要查看堆栈的大小。

StackElement element[];需要调整大小或声明如下:

StackElement element[MAX_SIZE]; 

0
投票

哦,我明白了。如果有人需要类似的东西,这里是代码:

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class StackElement {
private:
    int data;
    string name;
public:
    StackElement() {
        data=0;
        name="-";
        }
    StackElement(int d, string n) {
        data = d;
        name = n;
        }
    void getElement() {
        cin>>data;
        cout<<"Enter name: "<<endl;
        cin>>name;
        }
};
class Stack {
private:
    int stackSize;
    int pos;
    StackElement *element;
public:
    Stack() {
        stackSize = 10;
        element = new StackElement[stackSize];
        }
    Stack(int s) {
        stackSize = s;
        element = new StackElement[stackSize];
        }
    void push() {
        element[pos++].getElement();
        ++stackSize;
        }
    StackElement pop() {
        return element[--pos];
        }
    bool isEmpty() {
        return pos == 0;
        }
    bool isFull() {
        return stackSize == pos;
        }
    void position() {
        pos=0;
    }
};

int main() {
    Stack stack(10);
    stack.position();
    int choice;
    cout<<"1. Push in stack.\n2. Pop from stack.\n3. Exit."<<endl;
    if(stack.isEmpty())
        cout<<endl<<"Stack is empty."<<endl<<endl;
    do {
        cout<<"Enter your choice"<<endl;
        cin>>choice;
        switch(choice) {
            case 1:
                cout<<"Enter value:"<<endl;
                stack.push();
                break;
            case 2:
                if(!stack.isEmpty())
                    stack.pop();
                else
                    cout<<"Stack is empty already."<<endl;
                break;
            case 3:
                cout<<"Exit"<<endl;
                break;
            default:
                cout<<"Invalid choice"<<endl;
        }
        if(stack.isFull()) {
            cout<<"Stack is full!"<<endl;
            break;
        }
    } while (choice != 4);
return 0;
}

PS。我知道它缺乏释放内存和析构函数,我可能会在不久的将来工作:)

© www.soinside.com 2019 - 2024. All rights reserved.