用两个队列实现栈

【要求】

用两个队列queue1,queue2来实现栈的压栈和出栈功能。


【分析】

此问题类似于用两个栈实现队列的功能的思路,将队列queue1作为入栈专职,queue2作为中转,主要思路是,压栈时将所有元素全部进队queue1,出栈时由于要将queue1最后一个进来的元素输出,所以先将queue1除最后一个元素以外的所有元素转到queue2,出队输出最后一个元素后,将queue2所有元素出队,重新入队到queue1,从而实现栈的后进先出功能。


【举例】

这里写图片描述

abcde依次入队,就能实现入栈;若要出栈,则先出队,留下最后一个e输出,再把移动的元素还给原队,就是这么简单。


【测试代码】

#include<stdio.h>
#include<stdlib.h>
#define MAX 10
typedef int my_data;
typedef struct my_queue
{
    my_data data[MAX];
    int front;
    int rear;
}my_queue;

//初始化一个空队列
int init_queue(my_queue *Q)
{
    Q->front = 0;
    Q->rear = 0;
    return 0;
}
//入队
int enqueue(my_queue *Q, my_data e)
{
    //判断队满?
    if((Q->rear+1)%MAX == Q->front)
        return 1;

    Q->data[Q->rear] = e;
    Q->rear = (Q->rear +1)%MAX;//移一位

    return 0;
}
//出队
int dequeue(my_queue *Q, my_data *e)
{
    //先判断是否为空队
    if(Q->rear == Q->front)
        return 1;

    *e = Q->data[Q->front];
    Q->front = (Q->front+1)%MAX;//移一位

    return 0;
}
//队列长度
int queue_length(my_queue *Q)
{
    return (Q->rear-Q->front+MAX)%MAX;
}
void push(my_queue *Q1,my_queue *Q2,my_data *e)
{
      enqueue(Q1,*e);
}
void pop(my_queue *Q1,my_queue *Q2,my_data *e)
{
    if(Q2->front == Q2->rear)
    {
        while(Q1->front +1!= Q1->rear)
        {
            dequeue(Q1,e);
            enqueue(Q2,*e);
        }       
        dequeue(Q1,e);
        printf("谁出去了%d\n",*e);
    }

    while(Q2->front != Q2->rear)
    {
        dequeue(Q2,e);
        enqueue(Q1,*e);
    }
}

void test(my_queue *Q1,my_queue *Q2,my_data *e)
{
    int s[MAX];
    printf("请输入入队成员\n");
    for(int i= 0; i<MAX-1;i++)
    {
        scanf("%d",&s[i]);
        push(Q1,Q2,&s[i]);
    }
    int length =queue_length(Q1);
    printf("q1队列长度%d\n",length);

    printf("***************\n");

    pop(Q1,Q2,e);
    printf("q1队列长度%d\n",queue_length(Q1));
    printf("***************\n");
    pop(Q1,Q2,e);
   printf("q1队列长度%d\n",queue_length(Q1));
}
int main()
{
    my_queue *queue1 = (my_queue *)malloc(sizeof(my_queue));
    my_queue *queue2 = (my_queue *)malloc(sizeof(my_queue));
    init_queue(queue1);
    init_queue(queue2);
    my_data *e = (my_data *)malloc(sizeof(my_data));
    test(queue1,queue2,e);

}

【输出】
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值