首先写书写队列的一些功能
#include<stdlib.h>
#include<string.h>
#define INITSIZE 10
typedef int ElemType;
typedef struct queue
{
ElemType *data;//存储元素的空间的首地址
int front;//队列头
int rear;//队列尾
int size;//标识当前空间的结束位置 扩容
}Queue;
void InitQueue(Queue *que)//初始化
{
if(que==NULL) exit(0);
que->data=(ElemType *)malloc(sizeof(ElemType)*INITSIZE);
if(que->data==NULL) exit(0);
que->front=que->rear=0;
que->size=INITSIZE;
}
static bool AppendSpace(Queue *que)//扩容
{
ElemType *new_space=(ElemType *)malloc(sizeof(ElemType)*que->size*2);
if(new_space==NULL) return false;
int index=0;
while(que->front!=que->rear)
{
new_space[index++]=que->data[que->front];
que->front=(que->front+1)%que->size;
}
que->front=0;
que->rear=que->size-1;
que->size *=2;
free(que->data);
que->data=new_space;
return true;
}
int QueueSize(Queue *que)
{
if(que==NULL) exit(0);
return que->size;
}
bool IsFull(Queue *que)//判满
{
if(que==NULL) exit(0);
return (que->rear+1)%que->size==que->front;//类似于处理环形
}
bool IsEmpty(Queue *que)//判空
{
if(que==NULL) exit(0);
return que->front==que->rear;
}
bool Push(Queue *que,ElemType val)//入队(从尾入)
{
if(que==NULL) exit(0);
if(IsFull(que))
{
if(!AppendSpace(que))
{
return false;
}
}
que->data[que->rear]=val;
que->rear=(que->rear+1)%que->size;
return true;
}
int Top(Queue *que)//获取队列头的值
{
if(que==NULL) exit(0);
if(IsEmpty(que)) return false;
return que->data[que->front];
}
//获取队尾元素
int Back(Queue* que)
{
if(que==NULL) exit(0);
return que->data[que->rear];
}
bool Pop(Queue *que)//出队(从头出)
{
if(que==NULL) exit(0);
if(IsEmpty(que)) return false;
que->front=(que->front+1)%que->size;
return true;
}
void DestroyQueue(Queue *que)//销毁
{
if(que==NULL) exit(0);
free(que->data);
que->data=NULL;
que->front=que->rear=que->size=0;
}
根据据图的分析,我们完成用 两个队列实现栈 的操作
typedef struct mystack
{
Queue q1;
Queue q2;
}MyStack;//定义两个队列实现的栈的结构体
MyStack *mystack()//初始化
{
MyStack* s= (MyStack*)malloc(sizeof(MyStack));
if(s==NULL) exit(0);
InitQueue(&s->q1);
InitQueue(&s->q2);
return s;
}
void myStackPush(MyStack*que, int x)//哪个队列有元素,将元素插入到此队列中
{
if(que==NULL) exit(0);
if(!IsEmpty(&que->q1))
{
Push(&que->q1, x);
}
else
{
Push(&que->q2, x);
}
}
int myStackPop(MyStack* que)//出栈
{
if(que==NULL) exit(0);
int tmp=0;
if(!IsEmpty(&que->q1))
{ //q1队列中有元素,将q1中n-1个元素搬移到q2中
while(QueueSize(&que->q1) > 1)
{
Push(&que->q2, Top(&que->q1));
Pop(&que->q1);
}
tmp=Top(&que->q1);
//最后将q1中剩余的一个元素删除掉
Pop(&que->q1);
}
else
{ //q2队列中有元素,将q2中n-1个元素搬移到q2中
while(QueueSize(&que->q2) > 1)
{
Push(&que->q1, Top(&que->q2));
Pop(&que->q2);
}
tmp = Top(&que->q2);
//最后将q1中剩余的一个元素删除掉
Pop(&que->q2);
}
return tmp;
}
int myStackTop(MyStack* que)//获取栈顶的值
{
if(que==NULL) exit(0);
if(!IsEmpty(&que->q1))
{
return Back(&que->q1);
}
else
{
return Back(&que->q2);
}
}
bool IsMystackEmpty(MyStack* que)//判空
{
if(que==NULL) exit(0);
return IsEmpty(&que->q1) && IsEmpty(&que->q2);
}
void DestroymyStack(MyStack* que)//销毁
{
if(que==NULL) exit(0);
DestroyQueue(&que->q1);
DestroyQueue(&que->q2);
free(que);
}