两个队列实现一个栈

1.主要思想

栈的特点:先进后出。队列的特点:先进先出。
我们在用两个队列实现栈的时候是用顺序队列。
在这里插入图片描述

2.结构设计

既然是用两个队列实现栈的操作,所以定义的结构体中的成员就是两个队列。

typedef struct
{
   
	SqQueue q1;
	SqQueue q2;
}TQStack, *PTQStack;

3.基本操作

  1. 我们要实现的是一个栈,所以所有的操作都是基于栈的基础上,栈有什么操作,我们实现的就有什么操作。
  2. 我们用两个队列实现栈的操作中,队列的所有操作是给定的,在我们实现栈的过程中,只需要调用其函数即可(见顺序队列)。

(1)初始化

void my_InitStack(PTQStack ptq)
{
   
	assert(ptq != NULL);
	if (ptq == NULL)return;

	Init_Queue(&ptq->q1);
	Init_Queue(&ptq->q2);
}

(2)入栈

哪个队列不空就入哪个队列。

bool my_Push(PTQStack ptq, int val)
{
   
	assert(ptq != NULL);
	if (ptq == NULL)return false;

	if (!IsEmpty(&ptq->q1))
	{
   
		return Push(&ptq->q1,val);
	}
	else
	{
   
		return Push(&ptq->q2, val);
	}
}

(3)获取栈顶第一个元素的值,但不删除

栈顶的元素就是队列尾的元素,要将队列尾部的元素得到,就需要将其他元素一次存放进另一个队列中保存。

bool my_GetTop(PTQStack ptq, int* rtval)
{
   
	assert(ptq != NULL && rtval != NULL);
	if (ptq == NULL || rtval == NULL)return false;

	if (!IsEmpty(&ptq->q1))//如果q1不空,就将q1中的元素只留一个,其他的都存入q2中。最后一个数就是栈顶元素;
	{
   
		while (Get_length(&ptq->q1) > 1)
		{
   
			int tmp = 0;
			Pop(&ptq->q1, &tmp);
			Push(&ptq->q2, tmp);
		}
		return Get_top(&ptq->q1, rtval);
	}
	else
	{
   
		while (Get_length(&ptq->q2) > 1)
		{
   
			int tmp = 0;
			Pop(&ptq->q2, &tmp);
			Push
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值