1.顺序栈
顺序栈的主要特征是用一个数组实现栈的存储,top指针确定栈顶元素位置
定义形式如下:
#define Max 100
template <class T>
class SeqStack{
public:
SeqStack():top(-1){}
void Push(T x);
T getTop();
T Pop();
bool IsEmpty();
bool IsFull();
int getSize();
private:
T A[Max];
int top;
}
2.链栈
链栈的特点是在主体链栈类外定义一个结构体,来实现结点的存储,在类中定义top指针,指向Node头结点。
定义形式如下:
template <class T>
struct Node{
T data;
Node<T> *next;
};
template <class T>
class LinkedStack
{
public:
LinkedStack();
void Push(const T&x);
T Pop();
T getTop();
bool IsEmpty()const{return (top->next==NULL)?true:false;}
int getSize()const;
void makeEmpty();
private:
Node<T> *top; //栈顶指针
};
3.顺序队列
队列基于数组的存储表示称为顺序队列,front指向队首,队首删除元素,rear队尾,队尾添加元素。
但是单纯的数组表示,可能会造成浪费空间。
为了充分利用存储空间,将数组的前端front和后端rear连接起来,形成一个环形的表,称为循环队列。
循环队列定义特征是:
(1)利用数组实现存储。
(2)有两个整数值作为指针功能,front指向队首元素,rear指向队尾元素的下一位,注意不是队尾元素。
实际上front、rear即为数组第一个元素和最后一个元素下一位的下标。
(3)由于是循环队列,每次删除,或者添加元素,或者判断队列是否满的时候,注意判别式的写法
①删除元素:front=(front+1)%Max;
②添加元素:rear=x;rear=(rear+1)%Max;
③判断队列是否满:if((rear+1)%Max==front) 栈满
④判断队列是否为空:if(rear==front) 栈空
⑤得到队列长度:length=(rear-front+Max)%Max
⑥得到队尾元素:注意不是data[rear] 而是data[rear-1]
循环队列的定义形式如下:
template <class T>
class SeqQueue{
public:
SeqQueue(){MakeEmpty();}
void MakeEmpty();
bool EnQueue(T x);
bool DeQueue(T &x);
T getFront();
bool IsEmpty();
bool IsFull();
int getSize();
T getRear();
private:
T data[Max];
int front_;
int rear;
};
4.链队列
链队列不是用数组实现存储功能,而是定义一个结构体来表示结点,故不存在浪费空间,也不用考虑循环的问题
template <class T>
struct Node{
T data;
Node *next;
};
template <class T>
class LinkedQueue
{
public:
LinkedQueue();
~LinkedQueue(){front_=rear=0;}
T getFront();
T getRear();
void EnQueue(T x);
void DeQueue();
bool IsEmpty();
int getSize();
private:
Node<T> *front_,*rear;
};
下几篇将给出具体的创建顺序栈、链栈、顺序队列(循环队列)、链队列的代码