//用两个堆栈表示一个队列。完全原创哈,有更好算法的朋友请告诉我下哈,谢谢。
#include "iostream.h"
#include "malloc.h"
typedef struct Stack //定义堆栈
{
int *base;
int *top;
int stacksize;
}Stack;
int InitStack(Stack &s) //初始化堆栈
{
s.base=(int *)malloc(100*sizeof(int));
if(!s.base)
return 0;
s.top=s.base;
s.stacksize=100;
return 1;
}
int DestroyStack(Stack &s) //销毁堆栈
{
free (s.base);
free (s.top);
return 1;
}
void ClearStack(Stack &s) //清除堆栈中的内容
{
s.top=s.base;
}
int StackEmpty(Stack s) //判断堆栈是否为空
{
if(s.base==s.top)
return 1;
else return 0;
}
int StackLength(Stack s) //堆栈的长度
{
return (s.top-s.base);
}
int GetTop(Stack s,int &e) //获取堆栈的数据
{
if(s.top==s.base)
return 0;
e=*(s.top-1);
return e;
}
int Push(Stack &s,int &e) //进栈
{
if(s.top-s.base>=s.stacksize)
{
s.base=(int *)realloc(s.base,(s.stacksize+10)*sizeof(int));
if(!s.base)
return 0;
s.top=s.base+s.stacksize;
s.stacksize+=10;
}
*s.top++=e;
s.stacksize++;
return 1;
}
int Pop(Stack &s,int &e) //出栈
{
if(s.top==s.base)
return 0;
e=*--s.top;
--s.stacksize;
return e;
}
typedef struct queue //定义队列
{
Stack a;
Stack b;
}Queue;
int InitQueue(Queue &q) //初始化队列
{
InitStack(q.a);
InitStack(q.b);
return 1;
}
int DestroyQueue(Queue &q) //销毁队列
{
DestroyStack(q.a);
DestroyStack(q.b);
if(DestroyStack(q.a)&&DestroyStack(q.b))
return 1;
}
void ClearQueue(Queue &q) //清除队列
{
ClearStack(q.a);
ClearStack(q.b);
}
int QueueEmpty(Queue q)
{
if(StackEmpty(q.a)==1&&StackEmpty(q.b)==1)
return 1;//返回1表示队列为空
else return 0;
}
int QueueLength(Queue q)
{
return ((q.a.top-q.a.base)+(q.b.top-q.b.base));
}
int GetQueueTop(Queue q,int &e) //获取队列的数据
{
if(QueueEmpty(q)==0)
return GetTop(q.b,e);
else return 0;
}
int PushQueue(Queue &q,int &e) //进队
{
Push(q.a,e);
q.a.stacksize++;
if(Push(q.a,e))
return 1;
else return 0;
}
int PopQueue(Queue &q,int &temp) //出队
{
int e;
if(StackEmpty(q.b)==1)
{
if(StackEmpty(q.a)==1)
return 0;
else
while(StackEmpty(q.a)==0)
{
q.a.top--;
*q.b.top=*q.a.top;
q.b.top++;
}
}
temp=Pop(q.b,e);
cout<<temp;
q.b.stacksize--;
if(Pop(q.b,e))
return 1;
else return 0;
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//主函数部分
int main(int argc, char* argv[])
{
//……………………测试堆栈,与题无关………………………………
/*
Stack s_a,s_b;
int w=10;
int r;
InitStack(s_a);
InitStack(s_b);
Push(s_a,w);
Pop(s_a,r);
cout<<r<<endl;
if(StackEmpty(s_a)==1)
cout<<"堆栈为空。"<<endl;
else cout<<"堆栈为空。"<<endl;
*/
//……………………………………………………………………………
//…………………………队列的实现部分………………………………
Queue q_a;
int e[7]={1,2,3,6,4,77,1};
int b[7]={0};
InitQueue(q_a);
cout<<"进队顺序为:";
if(QueueEmpty(q_a)==1)
{
for(int i=1;i<=7;i++)
{
PushQueue(q_a,e[i-1]);
cout<<e[i-1]<<" ";
}
}
cout<<endl;
cout<<"出队顺序为:";
for(int i=1;i<=7;i++)
{
PopQueue(q_a,b[i]);
cout<<" ";
}cout<<endl;
return 0;
}