兩個棧實現一個佇列 兩個佇列實現一個棧
阿新 • • 發佈:2018-11-20
棧和佇列實現的程式碼在連結中的部落格https://blog.csdn.net/Damn_Yang/article/details/83928852
兩個棧實現一個佇列
思路:
入隊時,直接壓入stack1中
出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素
程式碼實現(C)
Topic.h
#pragma once #include "Queue.h" #include "Stack.h" // 兩個棧實現一個佇列 typedef struct QueueByTwoStack { Stack s1; Stack s2; }QueueByTwoStack; void QueueByTwoStackInit(QueueByTwoStack*qts); void QueueByTwoStackDestory(QueueByTwoStack*qts); void QueueByTwoStackPush(QueueByTwoStack*qts, DataType x); void QueueByTwoStackPop(QueueByTwoStack*qts); DataType QueueByTwoStackFront(QueueByTwoStack*qts); int QueueByTwoStackEmpty(QueueByTwoStack*qts); int QueueByTwoStackSize(QueueByTwoStack*qts); void TestQueueByTwoStack();
Topic.c
#include"Topic.h" void QueueByTwoStackInit(QueueByTwoStack*qts) { assert(qts); StackInit(&qts->s1); StackInit(&qts->s2); } void QueueByTwoStackDestory(QueueByTwoStack*qts) { assert(qts); StackDestory(&qts->s1); StackDestory(&qts->s2); } void QueueByTwoStackPush(QueueByTwoStack*qts, DataType x) { StackPush(&qts->s1,x); } //如果s2有資料直接出 //如果s2沒有資料,則將s1的資料倒過來 void QueueByTwoStackPop(QueueByTwoStack*qts) { if (StackEmpty(&qts->s2)) { while (StackEmpty(&qts->s1)) { StackPush(&qts->s2, StackTop(&qts->s1)); StackPop(&qts->s1); } } StackPop(&qts->s2); } DataType QueueByTwoStackFront(QueueByTwoStack*qts) { assert(qts); if (StackEmpty(&qts->s2)) { while (StackEmpty(&qts->s1)) { StackPush(&qts->s2, StackTop(&qts->s1)); StackPop(&qts->s1); } } return StackTop(&qts->s2); } int QueueByTwoStackEmpty(QueueByTwoStack*qts) { assert(qts); return StackEmpty(&qts->s1) | StackEmpty(&qts->s2); } int QueueByTwoStackSize(QueueByTwoStack*qts) { assert(qts); return StackSize(&qts->s1) + StackSize(&qts->s2); } void TestQueueByTwoStack() { QueueByTwoStack q; QueueByTwoStackInit(&q); QueueByTwoStackPush(&q, 1); QueueByTwoStackPush(&q, 2); QueueByTwoStackPush(&q, 3); QueueByTwoStackPush(&q, 4); QueueByTwoStackPop(&q); QueueByTwoStackPop(&q); QueueByTwoStackPush(&q, 5); QueueByTwoStackPush(&q, 6); while (QueueByTwoStackEmpty(&q)) { printf("%d ", QueueByTwoStackFront(&q)); QueueByTwoStackPop(&q); } printf("\n"); }
兩個佇列實現一個棧
思路:
入棧時,壓入到空棧中,q1和q2哪個為空入到哪個裡面去(例如q1為空)
出棧時,先將queue1中的元素除最後一個元素外依次出佇列,並壓入佇列queue2中,將留在queue1中的最後一個元素出佇列即為 出棧元素,最後還要把queue2中的元素再次壓入queue1中
程式碼實現(C語言)
Topic.h
#include "Stack.h" #include "Queue.h" typedef struct StackByTwoQueue { Queue q1; Queue q2; }StackByTwoQueue; void StackByTwoQueueInit(StackByTwoQueue* stq); void StackByTwoQueueDestory(StackByTwoQueue* stq); void StackByTwoQueuePush(StackByTwoQueue* stq, DataType x); void StackByTwoQueuePop(StackByTwoQueue* stq); DataType StackByTwoQueueTop(StackByTwoQueue*stq); int StackByTwoQueueEmpty(StackByTwoQueue* stq); int StackByTwoQueueSize(StackByTwoQueue* stq);
Topic.c
#include "Topic.h"
void StackByTwoQueueInit(StackByTwoQueue* stq)
{
assert(stq);
QueueInit(&stq->q1);
QueueInit(&stq->q2);
}
void StackByTwoQueueDestory(StackByTwoQueue* stq)
{
QueueDestory(&stq->q1);
QueueDestory(&stq->q2);
}
void StackByTwoQueuePush(StackByTwoQueue* stq, DataType x)
{
assert(stq);
if (!QueueEmpty(&stq->q1))
{
QueuePush(&stq->q1, x);
}
else
{
QueuePush(&stq->q2, x);
}
}
void StackByTwoQueuePop(StackByTwoQueue* stq)
{
assert(stq);
Queue*empty = &stq->q1, *nonempty = &stq->q2;
if (!QueueEmpty(&stq->q1))
{
empty = &stq->q2;
nonempty = &stq->q1;
}
while (QueueSize(nonempty) > 1)
{
QueuePush(empty, QueueFront(nonempty));
QueuePop(nonempty);
}
QueuePop(nonempty);
}
DataType StackByTwoQueueTop(StackByTwoQueue*stq)
{
assert(stq);
if (QueueEmpty(&stq->q1) != 0)
{
return stq->q1._back->_data;
}
else
{
return stq->q2._back->_data;
}
}
int StackByTwoQueueEmpty(StackByTwoQueue* stq)
{
assert(stq);
return QueueEmpty(&stq->q1) | QueueEmpty(&stq->q2);
}
int StackByTwoQueueSize(StackByTwoQueue* stq)
{
assert(stq);
return QueueSize(&stq->q1) + QueueSize(&stq->q2);
}
TestStackByTwoQueue()
{
StackByTwoQueue s;
StackByTwoQueueInit(&s);
StackByTwoQueuePush(&s, 1);
StackByTwoQueuePush(&s, 2);
StackByTwoQueuePush(&s, 3);
StackByTwoQueuePush(&s, 4);
StackByTwoQueuePush(&s, 5);
while (StackByTwoQueueEmpty(&s))
{
printf("%d ", StackByTwoQueueTop(&s));
StackByTwoQueuePop(&s);
}
}