#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;//队列1
Queue 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)
{
//assert
Init_Queue(&ptq->q1);
Init_Queue(&ptq->q2);
}
//入栈(或者叫压栈 push)
bool my_Push(PTQTStack ptq, ELEM_TYPE val)
{
//assert
if(!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都为空 则不需要Top
return 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)
{
//assert
if(!IsEmpty(&ptq->q1))
{
Show(&ptq->q1);
}
Show(&ptq->q2);
}