同端进出为栈, 异端进出为队列。
本质上就是支持双边操作的队列。
使用顺序存储:
typedef struct DuQueue{
int *base; //int base[Maxsize];
int front, rear;
} DuQueue;
bool InitQueue(DuQueue &Q)
{
Q.base = new int[Maxsize];
if(!Q.base){
return false;
}
Q.front = Q.rear = 0;
return true;
}
bool Push_back(DuQueue &Q, int e) //尾进
{
if((Q.rear+1)%Maxsize == Q.front){
return false;
}
Q.base[Q.rear] = e;
Q.rear =(Q.rear+1)%Maxsize;
return true;
}
bool Pop_front(DuQueue &Q, int &e) //头出
{
if(Q.front == Q.rear){
return false;
}
e = Q.base[Q.front];
Q.front = (Q.front+1)%Maxsize;
return true;
}
bool push_front(DuQueue &Q, int e) //头进
{
if(isFull(Q)){
return false;
}
Q.front = (Q.front-1+Maxsize)%Maxsize;
Q.base[Q.front] = e;
return true;
}
bool pop_back(DuQueue &Q, int &e) //尾出
{
if(isEmpty(Q)){
return false;
}
Q.rear = (Q.rear-1+Maxsize)%Maxsize;
e = Q.base[Q.rear];
return true;
}
bool get_front(DuQueue Q, ElemType &x) //取队头
{
if(isEmpty(Q)){
return false;
}
x=Q.base[Q.front];
return true;
}
bool get_back(DuQueue Q, ElemType &x) //取队尾
{
if(isEmpty(Q)){
return false;
}
x=Q.base[(Q.rear-1+Maxsize)%Maxsize];
return true;
}
int Length(DuQueue Q)
{
return (Q.rear-Q.front+Maxsize)%Maxsize;
}
void traverse(DuQueue Q)
{
if(isEmpty(Q))
{
cout<<"DuQueue is empty"<<endl;
return ;
}
int temp=Q.front;
while(temp! = Q.rear)
{
cout<<Q.base[temp]<<" ";
temp=(temp+1)%Maxsize;
}
cout<<endl<<"traverse is over! "<<endl;
}
void Relese(DuQueue &Q)
{
delete[] Q.base;
}