1. 思路
实现栈结构:栈结构是先进后出的,需要一个数组array、一个记录位置的变量index以及数组的大小size,当进来一个元素,size就++,出去一个元素size就–,然后弹出这个数据。
2. 代码
// 固定数组实现栈结构
#include <iostream>
#include <exception>
class ArrayIndexOutOfBoundsException : public std::exception {
public:
ArrayIndexOutOfBoundsException(const char* ptr) {
this -> ptr = ptr;
}
virtual const char* what() {
std::cout << this -> ptr << std::endl;
return ptr; // 返回ptr还是this -> ptr
}
private:
const char* ptr;
};
class MyStack {
public:
MyStack(int mystack_size_); // 构造函数
~MyStack(); // 析构函数
void myStackPush(int element); // 入栈
int myStackPop(); // 出栈
int myStackPeek(); // 获取栈顶元素
void printMyStack(); // 打印栈
private:
int* mydata_;
int mystack_size_; // 栈的大小
int mystack_index_; // 栈当前的索引
};
MyStack::MyStack(int mystack_size_) {
this -> mystack_size_ = mystack_size_;
mydata_ = new int[mystack_size_];
mystack_index_ = 0;
}
MyStack::~MyStack() {
delete [] mydata_;
}
void MyStack::myStackPush(int element) {
if (mystack_index_ == mystack_size_) { // 栈已经满了
throw ArrayIndexOutOfBoundsException("stack is full");
} else {
mydata_[mystack_index_++] = element;
}
}
int MyStack::myStackPop() {
if (mystack_index_ == 0) {
throw ArrayIndexOutOfBoundsException("stack is empty");
} else {
return mydata_[--mystack_index_];
}
}
int MyStack::myStackPeek() {
if (mystack_index_ == 0) {
return -1; // 如果当前栈为空的话peek函数返回的是-1
} else {
return mydata_[mystack_index_ - 1]; // 这里只是获取当前栈顶的元素
}
}
void MyStack::printMyStack() {
for (int i = 0; i < mystack_size_; ++i) {
std::cout << mydata_[i] << ',';
}
std::cout << "\n";
}
int main()
{
MyStack myStack1(5);
myStack1.myStackPush(1);
myStack1.myStackPush(2);
myStack1.myStackPush(3);
myStack1.myStackPush(4);
myStack1.myStackPush(5);
myStack1.printMyStack();
for (int i = 0; i < 5; ++i) {
std::cout << "pop=" << myStack1.myStackPop() << ",";
std::cout << "peek=" << myStack1.myStackPeek() << ",";
std::cout << std::endl;
}
myStack1.printMyStack();
return 0;
}