1. 程式人生 > >兩個棧實現一個佇列 兩個佇列實現一個棧

兩個棧實現一個佇列 兩個佇列實現一個棧

棧和佇列實現的程式碼在連結中的部落格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);
	}
}