栈无非就是一种特殊的线性表,特殊在它的运算操作上:先进后出。就像生活中叠箱子一样,先放的总是在最下面,并且总是最后才能取出。(相当于压栈之后弹出)
这次采用的是顺序表来实现栈(即顺序栈),下次再来用单链表来实现吧,也在这篇博客上跟进
这里是先在头文件(命名为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;
}
运行结果: