1.链栈
源代码:
#include <iostream>
using namespace std;
template<class DataType>
struct Node {
DataType data;
Node<DataType> *next;
Node<DataType>(DataType x) {
data = x;
next = NULL;
}
};
template <class DataType>
class LinkStack {
public:
LinkStack() // 构造函数 初始化一个空栈
{ top = NULL; }
~LinkStack() // 析构函数
{}
void Push(DataType x); // 入栈
DataType Pop(); // 出栈
DataType GetTop(); // 去栈顶元素
bool isEmpty() // 判断是否为空
{ return top == NULL ? true : false;}
void PrintStack(); // 输出栈
private:
Node<DataType> *top; // 栈顶指针
};
template <class DataType>
void LinkStack<DataType>::Push(DataType x)
{
Node<DataType> *s = new Node<DataType>(x);
s -> next = top; // 将结点插在栈顶
top = s;
}
template <class DataType>
DataType LinkStack<DataType>::Pop()
{
if (top == NULL) throw "下溢";
DataType x = top -> data;
Node<DataType> *p = top;
top = top -> next;
delete p;
return x;
}
template <class DataType>
DataType LinkStack<DataType>::GetTop()
{
if (top == NULL) throw "空栈";
return top -> data;
}
template <class DataType>
void LinkStack<DataType>::PrintStack()
{
if (top == NULL) {
cout << "空栈" << endl;
return;
}
}
int main(int argc, const char * argv[])
{
LinkStack<int> stack = LinkStack<int>();
for (int i = 0; i < 10; i++) {
stack.Push(i);
}
cout << stack.isEmpty() << endl;
cout << stack.GetTop() << endl;
cout << "Pop : " << stack.Pop() << endl;
cout << "Pop : " << stack.Pop() << endl;
cout << stack.GetTop() << endl;
return 0;
}
运行结果图:
2.顺序队列:
源代码:
#include<iostream.h>
const int QueueSize = 100;
template<class DataType>
class CirQueue{
public:
CirQueue() //构造函数,初始化一个空队列
{
front = rear = QueueSize -1;
}
~CirQueue(){} //析构函数
void EnQueue(DataType x); //入队
DataType DeQueue(); // 出队
DataType GetQueue(); // 取队头元素
bool isEmpty() //判断队列是否为空
{ return front == rear ? true : false; }
void PrintQueue(); //输出队列
private:
DataType data[QueueSize];
int front; // 队头指针
int rear; // 队尾指针
};
template <class DataType>
void CirQueue<DataType>::EnQueue(DataType x)
{
if ((rear+1) % QueueSize == front) throw "上溢";
rear = (rear+1) % QueueSize;
data[rear] = x;
}
template <class DataType>
DataType CirQueue<DataType>::DeQueue()
{
if (front == rear) throw "下溢";
front = (front + 1) % QueueSize;
return data[front];
}
template <class DataType>
DataType CirQueue<DataType>::GetQueue()
{
if (front == rear) throw "下溢";
return data[(front+1) % QueueSize];
}
template <class DataType>
void CirQueue<DataType>::PrintQueue()
{
int p = front;
cout << "frint ";
while ((p+1) % QueueSize != (rear+1) % QueueSize - 1)
{
cout << data[(++p) % QueueSize] << " <- ";
}
cout << data[(rear+1) % QueueSize - 1];
cout << " rear" << endl;
}
int main(int argc, const char * argv[])
{
CirQueue<int> queue = CirQueue<int>();
cout << "isEmpty : " << queue.isEmpty() << endl;
for (int i = 2; i <= 11; i++)
{
queue.EnQueue(i);
}
queue.PrintQueue();
cout << "isEmpty : " << queue.isEmpty() << endl;
cout << "GetQueue : " << queue.GetQueue() << endl;
cout << "DeQueue : " << queue.DeQueue() << endl;
cout << "DeQueue : " << queue.DeQueue() << endl;
queue.PrintQueue();
cout << "GetQueue : " << queue.GetQueue() << endl;
return 0;
}
运行结果图: