用两个队列实现一个栈

该博客介绍了如何使用两个队列来实现一个符合先进先出原则的队列数据结构。在C++中,通过定义一个模板类`MyQueue`,并维护两个内部队列`queue1`和`queue2`,实现了插入(`appendTail`)、删除(`deleteHead`)和打印(`Print`)等操作。当删除队首元素时,会将队列重新调整以确保正确出队。示例代码展示了如何创建队列、添加元素、删除元素及打印队列内容的过程。
摘要由CSDN通过智能技术生成
#include <iostream>
#include<queue>
using namespace std;

template<typename T> class MyQueue
{
public:
	MyQueue(void);
	~MyQueue(void);
	void appendTail(const T& node);
	T deleteHead();
	void Print();
private:
	queue<T> queue1;
	queue<T> queue2;
};
template<typename T>
MyQueue<T>::MyQueue(void)
{
}
template<typename T>
MyQueue<T>::~MyQueue(void)
{
}
template<typename T>
void MyQueue<T>::appendTail(const T& node)
{
	//数据的插入原则:保持一个队列为空,一个队列不为空,往不为空的队列中插入元素
	if (!queue1.empty())
	{
		queue1.push(node);
	}
	else
	{
		queue2.push(node);
	}
}
template<typename T>
T MyQueue<T>::deleteHead()
{
	T result = 0;
	if (!queue1.empty())
	{
		while (queue1.size() > 1)
		{
			T& data = queue1.front();
			queue1.pop();
			queue2.push(data);
		}
		if (queue1.empty())
		{
			throw new exception("queue is empty");
		}
		result = queue1.front();
		queue1.pop();
	}
	else
	{
		while (queue2.size() > 1)
		{
			T& data = queue2.front();
			queue2.pop();
			queue1.push(data);
		}
		if (queue2.empty())
		{
			throw new exception("queue is empty");
		}
		result = queue2.front();
		queue2.pop();
	}
	return result;
}

template<typename T>
void MyQueue<T>::Print()
{
	if (!queue1.empty())
	{
		int len = queue1.size();
		for (int i = 0; i < len; ++i)
		{
			cout << queue1.front() << " ";
			queue1.push(queue1.front());
			queue1.pop();
		}
	}
	else if (!queue2.empty())
	{
		int len = queue2.size();
		for (int i = 0; i < len; ++i)
		{
			cout << queue2.front() << " ";
			queue2.push(queue2.front());
			queue2.pop();
		}
	}
}



int main()
{
	MyQueue<int> queue;
	cout << "往栈中添加元素:1 2 3" << endl;
	queue.appendTail(1);
	queue.appendTail(2);
	queue.appendTail(3);
	cout << "添加后栈内元素:";
	queue.Print();

	cout << endl << endl;

	int data = queue.deleteHead();
	cout << "删除的栈尾元素:" << data << endl;
	cout << "删除后的栈元素:";
	queue.Print();

	cout << endl << endl;

	cout << "往栈中添加元素:10 12" << endl;
	queue.appendTail(10);
	queue.appendTail(12);
	cout << "添加后:";
	queue.Print();

	cout << endl << endl;

	int data1 = queue.deleteHead();
	cout << "删除的栈尾元素:" << data1 << endl;
	cout << "删除后的栈元素:";
	queue.Print();

	cout << endl << endl;

	return 0;
}



在这里插入图片描述
传送门:用两个栈实现一个栈

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以用两个队列来模拟一个的数据结构,具体实现如下: 1. 定义两个队列queue1和queue2; 2. 将元素压入时,将元素放入queue1中; 3. 将元素弹出时,先将queue1中的元素依次出队并放入queue2中,直到queue1中只剩一个元素,将该元素出队返回即可; 4. 在弹出元素时,如果queue1中只有一个元素,直接出队返回即可,不需要将元素放入queue2中; 5. 在弹出元素时,交换queue1和queue2的指针,使得下一次弹出时可以从另一个队列中取出元素; 6. 使用两个队列实现,其空间复杂度为O(n),其中n为中元素的个数。 以下是使用C语言实现的代码: ``` #include <stdio.h> #include <stdlib.h> typedef struct Queue { int* data; int front; int rear; } Queue; typedef struct Stack { Queue* queue1; Queue* queue2; } Stack; Queue* createQueue(int size) { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->data = (int*)malloc(sizeof(int) * size); queue->front = 0; queue->rear = 0; return queue; } Stack* createStack(int size) { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->queue1 = createQueue(size); stack->queue2 = createQueue(size); return stack; } void push(Stack* stack, int value) { stack->queue1->data[stack->queue1->rear] = value; stack->queue1->rear++; } int pop(Stack* stack) { int value = 0; if(stack->queue1->front == stack->queue1->rear) { printf("Stack is empty.\n"); return -1; } while(stack->queue1->front < stack->queue1->rear - 1) { stack->queue2->data[stack->queue2->rear] = stack->queue1->data[stack->queue1->front]; stack->queue1->front++; stack->queue2->rear++; } value = stack->queue1->data[stack->queue1->front]; stack->queue1->front++; Queue* temp = stack->queue1; stack->queue1 = stack->queue2; stack->queue2 = temp; return value; } int main() { Stack* stack = createStack(10); push(stack, 1); push(stack, 2); push(stack, 3); printf("%d\n", pop(stack)); push(stack, 4); printf("%d\n", pop(stack)); printf("%d\n", pop(stack)); printf("%d\n", pop(stack)); printf("%d\n", pop(stack)); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值