码迷,mamicode.com
首页 > 其他好文 > 详细

用两个队列实现栈

时间:2015-05-27 19:05:45      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:队列      c   

【要求】

用两个队列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);

}

【输出】
技术分享

用两个队列实现栈

标签:队列      c   

原文地址:http://blog.csdn.net/xinyu913/article/details/46050457

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!