栈无非就是一种特殊的线性表,特殊在它的运算操作上:先进后出。就像生活中叠箱子一样,先放的总是在最下面,并且总是最后才能取出。(相当于压栈之后弹出)
这次采用的是顺序表来实现栈(即顺序栈),下次再来用单链表来实现吧,也在这篇博客上跟进
这里是先在头文件(命名为Stack.h)里声明一个虚基类Stack:
#pragma once //虚基类Stack class Stack { public: virtual bool IsEmpty() = 0; //纯虚函数,判断是否栈为空 virtual bool IsFull() = 0; //判断是否栈满 virtual void Push(const int x) = 0; //压栈 virtual bool Pop(int& x) = 0; //弹出 virtual bool GetTop(int& x) = 0; //得到栈顶的指针,并用x将栈顶的值返回 };接着是源文件(源文件里面主函数生成SeqStack类对象并简单应用了一下):
#include<iostream> #include"stack.h" using namespace std; class SeqStack :public Stack //顺序栈类 { private: int* array; //栈 int max_size; //顺序栈的存储空间大小 int top; //栈顶指针 bool OverFlow(); //栈满时增加栈的大小10 public: SeqStack(int m = 10); //构造函数,默认内存为10,栈空时栈顶指针为-1表示无值 SeqStack(SeqStack& a); //拷贝构造函数 bool IsEmpty(); //判断是否栈空 bool IsFull(); //判断是否栈满 void Push(const int i); //压栈 bool Pop(int& x); //弹出 bool GetTop(int& x); //获得栈顶元素值 int size() { return top+1; } //返回栈的大小 }; SeqStack::SeqStack(int m):top(-1), max_size(m) { array = new int[max_size]; if (array == NULL) { cerr << "error when creating an array !" << endl; exit(1); } } SeqStack::SeqStack(SeqStack& a) { max_size = a.max_size; top = a.top; array = new int[max_size]; for (int i = 0; i < max_size; i++) { array[i] = a.array[i]; } } bool SeqStack::IsEmpty() { if (top == -1) return true; else return false; } bool SeqStack::IsFull() { if (top == max_size - 1) //top和索引值一样,故当满时top==max_size-1 return true; else return false; } void SeqStack::Push(const int x) { if (IsFull()) OverFlow(); array[++top] = x; } bool SeqStack::Pop(int& x) { if (IsEmpty()) return false; else x = array[top--]; return true; } bool SeqStack::GetTop(int& x) { if (IsEmpty()) return false; x = array[top]; return true; } bool SeqStack::OverFlow() { int* new_array = new int[max_size + 10]; //其操作为新建一个数组,然后将该数组作为对象的私有成员 if (new_array == NULL) return false; for (int i = 0; i < max_size; i++) //复制原成员的值,因为栈满,故用max_size来限制循环次数 new_array[i] = array[i]; delete[] array; array = new_array; return true; } int main() { SeqStack* a = new SeqStack; int x; for (int i = 0; i < 3; i++) { a->Push(i); } cout << a->size() << endl; for (int i = 0; i < 3; i++) { cout << "pop results: " << a->Pop(x) << ' '; //bool类型返回运行结果,而引用x带回栈顶的值 cout << x; cout << endl; } cout << a->size() << endl; return 0; }运行结果: