#include "stack.h"
typedef struct ISQueue
{Stack s1;//入栈Stack s2;//出栈 ,如果栈s2为空,则将s1中保存的数据导入s1
}TSQueue,*PTSQueue;
void Init_Queue(PTSQueue pq);
#include "TwoStack_to_queue.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void Init_Queue(PTSQueue pq)
{Init_stack(&pq->s1);Init_stack(&pq->s2);
}//入队 push
bool push(PTSQueue pq, ELEM_TYPE val)
{return Push(&pq->s1,val);
}//出队 pop 需要删除操作
bool pop(PTSQueue pq, ELEM_TYPE* rtval)
{if (Isempty(pq)){return false;}if (IsEmpty(&pq->s2)){while (!IsEmpty(&pq->s1)){int tmp;//带出s1的中的值 Pop(&pq->s1, &tmp);//rtval是值 第一个栈出栈Push(&pq->s2, rtval); //第二个栈入栈}Pop(&pq->s2, rtval);//再将s2中的数据出出来}else{Pop(&pq->s2, rtval);}}
//top 获取队头元素值, 不需要删除操作
bool top(PTSQueue pq, ELEM_TYPE* rtval)
{if (Isempty(pq)){return false;}if (IsEmpty(&pq->s2)){while (!IsEmpty(&pq->s1)){int tmp;Pop(&pq->s1, tmp);//rtval是值 第一个栈出栈Push(&pq->s2, rtval); //第二个栈入栈}Top(&pq->s2, rtval);//再将s2中的数据出出来}else{Top(&pq->s2, rtval);}
}//获取其有效元素个数
int Get_length(PTSQueue pq)
{int len1 = Get_Length(&pq->s1); int len2 = Get_Length(&pq->s2);return len1 + len2;
}//判空
bool Isempty(PTSQueue pq)
{if (IsEmpty(&pq->s1) && IsEmpty(&pq->s2)){return true;}return false;
}//判满 不需要,栈可以自动扩容//清空
void clear(PTSQueue pq)
{Clear(&pq->s1);Clear(&pq->s2);
}//销毁
void destroy(PTSQueue pq)
{Destory(&pq->s1);Destory(&pq->s2);
}
两个队列实现一个栈
//设计我们需要的那个结构体:two_queue_to_stack
typedef struct TQTStack
{Queue q1;//队列1Queue q2;//队列2
}TQTStack, *PTQTStack;
q1为空有两种情况:
1.两个队列均为空
2.q2不空,q1空
include <assert.h>
#include <stdlib.h>
#include "Two_queue_to_stack.h"//初始化
void my_Init_stack(PTQTStack ptq)
{//assertInit_Queue(&ptq->q1);Init_Queue(&ptq->q2);
}//入栈(或者叫压栈 push)
bool my_Push(PTQTStack ptq, ELEM_TYPE val)
{//assertif(!IsEmpty(&ptq->q1)){return Push(&ptq->q1, val);}else{return Push(&ptq->q2, val);}
}//出栈(或者叫弹栈 pop(获取顶部数据,并且删除))//rtval是一个输出参数(C语言讲到)
bool my_Pop(PTQTStack ptq, ELEM_TYPE *rtval)
{//assert
//将不空的队列的最后一个值留下,其他的转移到另外一个空队列//再将最后一个元素出队if(my_IsEmpty(ptq))//若q1和q2都为空 则不需要出栈return false;int tmp;if(!IsEmpty(&ptq->q1)){int size = Get_length(&ptq->q1);while(size > 1){Pop(&ptq->q1, &tmp);//从q1里取值放到tmp里Push(&ptq->q2, tmp);//将tmp里的值入到q2中size--;//不能忘}//此处 while执行结束 代表着q1里仅剩下唯一的一个元素return Pop(&ptq->q1, rtval);}else{int size = Get_length(&ptq->q2);while(size > 1){Pop(&ptq->q2, &tmp);//从q2里取值放到tmp里Push(&ptq->q1, tmp);//将tmp里的值入到q1中size--;//不能忘}//此处 while执行结束 代表着q2里仅剩下唯一的一个元素return Pop(&ptq->q2, rtval);}}//获取顶部元素值 top(获取顶部数据)
bool my_Top(PTQTStack ptq, ELEM_TYPE *rtval)
{if(my_IsEmpty(ptq))//若q1和q2都为空 则不需要Topreturn false;int tmp;if(!IsEmpty(&ptq->q1))//当q1不空,则数据都在q1里{int size = Get_length(&ptq->q1);while(size > 1){Pop(&ptq->q1, &tmp);//从q1里取值放到tmp里Push(&ptq->q2, tmp);//将tmp里的值入到q2中size--;//不能忘}//此处 while执行结束 代表着q1里仅剩下唯一的一个元素Top(&ptq->q1, rtval);Pop(&ptq->q1, &tmp);Push(&ptq->q2, tmp);return true;}else{int size = Get_length(&ptq->q2);while(size > 1){Pop(&ptq->q2, &tmp);//从q2里取值放到tmp里Push(&ptq->q1, tmp);//将tmp里的值入到q1中size--;//不能忘}//此处 while执行结束 代表着q2里仅剩下唯一的一个元素Top(&ptq->q2, rtval);Pop(&ptq->q2, &tmp);Push(&ptq->q1, tmp);return true;}
}//获取其有效数据个数
int my_Get_length(PTQTStack ptq)
{return Get_length(&ptq->q1) + Get_length(&ptq->q2);//0+0 x+0 0+x
}//判空
bool my_IsEmpty(PTQTStack ptq)
{//当q1和q2都为空的时候 才为空return IsEmpty(&ptq->q1) && IsEmpty(&ptq->q2);
}//判满
bool my_IsFull(PTQTStack ptq)
{if(!IsEmpty(&ptq->q1)){return IsFull(&ptq->q1);}return IsFull(&ptq->q2);
}扩容
//static void my_Inc(PTQTStack ptq);//清空 一间房住了一户人 清空相当于把人赶出去
void my_Clear(PTQTStack ptq)
{Clear(&ptq->q1);Clear(&ptq->q2);
}
//销毁 一间房住了一户人 销毁相当于把人赶出去还把房烧了
void my_Destroy(PTQTStack ptq)
{Destroy(&ptq->q1);Destroy(&ptq->q2);
}//打印
void my_Show(PTQTStack ptq)
{//assertif(!IsEmpty(&ptq->q1)){Show(&ptq->q1);}Show(&ptq->q2);
}