两个队列实现一个栈

之前写过通过两个栈来实现一个队列的情况,今天是两个队列实现一个栈,其实还是之前说的,队列和栈的区别还是本质上的对数据操作的区别,栈是只能在栈顶位置进行操作,队则是队尾插入元素,队头删除元素。

 

这是两个队。还是同样选取其中一个队当做入数据的,因为栈是先进后出,所以当你入数据的队列完成入数据的时候,如果想出就需要借用Q2队列,

 

依次入四个元素1234,这时候如果想出元素的话,要出的是最后进的元素4,和两个栈实现队列不同,两个队再怎么倒过来倒过去,1先进入Q1,倒入Q2的话那一定是先从Q1出,所以先进入Q2,所以再出依然是先出1,所以这样是不能实现的。

  如果要是想出最后一个入的元素4的话就需要先将他前边的元素,放到Q2中。

 

在输出结束之后,因为你入元素一直都是入到Q1中,所以在你输出之后,需要将Q2中元素,在倒入到Q1

 

也就是Q2还是空的,Q1中已经把最后一个元素出去了。这时候入元素的话还是直接入就可以。

void StackByTwoQueuePush(Queue *s1, Queue *s2, Datatype m)

 {

     Queuepush(s1,m);

}

入元素的话直接在S1中入元素就可以。

void StackByTwoQueuePop(Queue *s1, Queue *s2)

 {

int size = 0;

int i = 0;

if (Queuesize(s1) != 0)

 {

  size = Queuesize(s1);

   for ( i = 0; i<size-1; i++)

 {

 Queuepush(s2, QueuePop(s1));

             

 }

num = QueuePop(s1);

printf("%d", num);

      }

size = Queuesize(s2);

for (i = 0; i<size - 1; i++)

{

Queuepush(s1, QueuePop(s2));

 

}

 }


如果要是出元素的话,首先要将S1中的数据放到S2中,在S1中留一个最后的数据,然后将这个数据赋值给num将num输出即可。在输出结束之后还要将S2中的所有数据返回到S1中。

  • 0
    点赞
  • 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、付费专栏及课程。

余额充值