0

所以我有一个使用 LIFO(后进先出)方法的类 CStack。使用标准变量bottom/top/size和方法,例如push/pop/full/empty/print. 这是一个char堆栈。

我的问题是,如果我在这个堆栈中添加一些东西,当它已满时,我怎样才能自动调整大小?我已经想到了该 memcpy()方法,但我并不真正了解它是如何工作的(还)。

任何帮助将不胜感激。

这是我的代码:

class CStack {
private:
    char *bottom_;
    char *top_;
    int size_;
public:

    CStack(int n = 20) {
        bottom_ = new char[n];
        top_ = bottom_;
        size_ = n;
    }

    void push(char c) {
        *top_ = c;
        top_++;
    }

    int num_items() {
        return (top_ - bottom_);
    }

    char pop() {
        top_--;
        return *top_;
    }

    int full() {
        return (num_items() >= size_);
    }

    int empty() {
        return (num_items() <= 0);
    }

    void print() {
        cout << "Stack currently holds " << num_items() << " items: ";
        for (char *element = bottom_; element < top_; element++) {
            cout << " " << *element;
        }
        cout << "\n";
    }

    ~CStack() { // stacks when exiting functions 
        delete [] bottom_;
    }
};
4

1 回答 1

2

这应该做你想要的。它不处理异常,但我猜你的课程还没有那么远?

void push(char c) {
    int used = top - bottom;
    if (used >= size_) {
        // grow the stack
        char* newBottom = new char[used + 20];
        memcpy(newBottom, bottom_, used * sizeof(char));
        top_ = newBottom + used;
        size_ = used + 20;
        delete[] bottom_;
        bottom_ = newBottom;        
    }
    *top_ = c;
    top_++;
}
于 2014-05-20T00:38:05.423 回答