使用两个队列实现一个栈。
(1)压栈:检测哪个队列有数据,将数据放到该队列。
(2)出栈:检测哪个队列有数据,将除队尾的数据导入另一个队列中,最后删除队尾。
(3)返回有数据的队尾节点。(前提是数据在该队列中)
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
typedef int QDataType;
typedef struct QListNode
{
struct QListNode *next;
QDataType data;
}QListNode;
typedef struct Queue
{
QListNode* front;
QListNode* rear;
QDataType sz;
}Queue;
typedef struct StackBy2Queue
{
Queue q1;
Queue q2;
}StackBy2Queue;
QListNode *BuyNewNode(QDataType data)
{
QListNode* newNode = (QListNode *)malloc(sizeof(QListNode));
if(NULL == newNode)
{
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void QueueInit(Queue* q)
{
assert(q);
q->front = q->rear = BuyNewNode(0);
q->sz = 0;
}
void QueuePush(Queue* q,QDataType data)
{
assert(q);
q->rear->next = BuyNewNode(data);
q->rear = q->rear->next;
q->sz++;
}
void QueuePop(Queue* q)
{
assert(q);
if(q->front != q->rear)
{
QListNode* pDel = q->front->next;
q->front->next = pDel->next;
q->sz--;
free(pDel);
pDel = NULL:
}
}
QDataType QueueFront(Queue* q)
{
assert(q);
return q->front->next->data;
}
QDataType QueueBack(Queue* q)
{
assert(q);
return q->rear->data;
}
int QueueSize(Queue* q)
{
assert(q);
return q->sz;
}
int QueueEmpty(Queue* q)
{
assert(q);
return 0==QueueSize(q);
}
//////////////////////////////////
//以上为队列的基本操作;
//以下为两个队列实现的栈的操作;
//////////////////////////////////
void StackBy2QueueInit(StackBy2Queue* s)
{
assert(s);
QueueInit(s->q1);
QueueInit(s->q2);
}
void StackBy2QueuePush(StackBy2Queue* s,QDataType data)
{
assert(s);
if(QueueSize(&s->q1))
{
QueuePush(&s->q1,data);
}
else
{
QueuePush(&s->q2,data);
}
}
void StackBy2QueuePop(StackBy2Queue* s)
{
assert(s);
if(QueueSize(&s->q1))
{
while(QueueSize(&s->q1)>1)
{
QueuePush(&s->q2,QueueFront(&s->q1));
QueuePop(&s>q1);
}
QueuePop(&s->q1);
}
else
{
while(QueueSize(&s->q2)>1)
{
QueuePush(&s->q1,QueueFront(&s->q2));
QueuePop(&s>q2);
}
QueuePop(&s->q2);
}
}
QDataType StackBy2QueueTop(StackBy2Queue *s)
{
assert(s);
if(QueueSize(&s->q1)
{
return QueueBack(&s->q1);
}
else
{
return QueueBack(&s->q2);
}
}