#include <iostream>
#include<stack>
using namespace std;
#define MAXSIZE 100
/*
用顺序结构实现的队列
其中front指向头结点
rear指向尾元素下一个结点
*/
typedef struct
{
char *array;
int front;
int rear;
}Squeue;
int DeQueue(Squeue &Q,char *result)//从队列中删除一个元素 ,结果存在result中
{
if(Q.rear==Q.front) //队列空则返回
{
return -1;
}
*result=Q.array[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return 0;
}
int EnQueue(Squeue &Q,const char elem)//从队列中插入一个元素
{
if((Q.rear+1)%MAXSIZE==Q.front) //队列满则返回
{
return -1;
}
Q.array[Q.rear]=elem;
Q.rear=(Q.rear+1)%MAXSIZE;
return 0;
}
bool isEmpty(const Squeue &Q)//判断队列是否为空
{
return Q.front==Q.rear;
}
bool isFull(const Squeue &Q)//判断队列是否为满
{
return (Q.rear+1)%MAXSIZE==Q.front;
}
int getLength(const Squeue &Q)//获取队列中元素个数
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
void initSqueue(Squeue &Q)//队列的初始化
{
Q.front=0;
Q.rear=0;
Q.array=new char[MAXSIZE];
memset(Q.array,0,MAXSIZE);
}
void show(const Squeue Q)//不删除元素遍历队列 ,当然这不符合队列这种数据结构的思想,仅是测试用
{
cout<<"队列中的元素:"<<endl;
for(int i=Q.front;i!=Q.rear;i=(i+1)%MAXSIZE)
{
cout<<Q.array[i]<<" ";
}
cout<<endl;
}
void reserve(Squeue &Q) //倒置队列
{
stack<char> mystack;
while(!isEmpty(Q))
{
char temp;
DeQueue(Q,&temp);
mystack.push(temp);
}
while(!mystack.empty())
{
char temp=mystack.top();
mystack.pop();
EnQueue(Q,temp);
}
}
int main(int argc, char *argv[])
{
Squeue myqueue;
initSqueue(myqueue);
for(char i='a';i<='z';i++)
{
EnQueue(myqueue,i);
}
show(myqueue);
cout<<"队列中元素个数:"<<getLength(myqueue)<<endl;
char tempData;
DeQueue(myqueue,&tempData);
cout<<"删除的数据为:"<<tempData<<endl;
show(myqueue);
reserve(myqueue);
show(myqueue);
delete[] myqueue.array;
return 0;
}