用两个队列实现栈

【要求】

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

}

【输出】

时间: 2024-11-06 14:13:27

用两个队列实现栈的相关文章

编程题目: 两个队列实现栈(Python)

感觉两个队列实现栈 比 两个栈实现队列 麻烦 1.栈为空:当两个队列都为空的时候,栈为空 2.入栈操作:当队列2为空的时候,将元素入队到队列1:当队列1位空的时候,将元素入队到队列2: 如果队列1 和 队列2 都为空的时候,那就选择入队到队列1. 3.出队操作:当两个队列都为空的时候,引发错误"栈为空": 当队列2位空的时候,如果队列1中只有一个元素,则直接将队列1中的元素出队: 如果队列1不止一个元素的时候,就将队列1的元素出队然后入队到队列2,知道队列1中只有一个元素,然后将队列1

剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈

题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 我们通过一个具体的例子来分析该队列插入和删除元素的过程.首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空.再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空. 这个时候,我们试着删除从队列中删除一个元素.

两个栈实现队列+两个队列实现栈----java

两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们需要的恰好再栈顶,出栈;若要给队列添加元素,即先进sack1,要出队时,若stack2不为空就出栈,为空时就把stack1全部进栈到stack2 二.两个队列实现一个栈 ps:图片原创于剑桥offer,来自网络 两个栈实现队列+两个队列实现栈----java,布布扣,bubuko.com

用两个栈实现队列和用两个队列实现栈

题目一:用两个栈实现队列,队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列的尾部插入节点和在队列的头部删除节点的功能. template <class T> class CQueue { CQueue(); ~CQueue(); void appendTail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; 如上

使用两个队列实现栈

废话:要找工作了,面试方面得做些准备了,刷一刷题应该没有坏处的,就从<剑指offer>开始吧. 第2.3.5节提到使用两个栈实现队列,相应的代码也已给出.练习题里有一道使用两个队列实现一个栈的题目,大体思路跟使用栈实现队列差不多,书里也给出了大致的思路.需要注意的一点是,如果每次入栈都选则将元素插入到第一个队列中,出队时先将前n-1个元素移交到第二个队列中,然后返回队列一中剩余的唯一一个元素,再将队列二中的元素又依次移交回队列一中,这样做未免效率过于低下. 事实上这样的思路我们可以看作是一直选

7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列 stack1,stack2 首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2 <span style="font-size:14px;">#include "static.h" #include <iostream> #include <stack> template<typename T> class

Algorithm --&gt; 两个栈实现队列和两个队列实现栈

两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如果s2不为空,把s2中的栈顶元素直接弹出:否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素. 代码: #include <stack> #include <iostream> #include <cassert> using namespace std; te

剑指offer (7) 两个栈实现队列 两个队列实现栈

题目:用两个栈实现一个队列. 队列的声明如下,请实现它的两个函数 appendTail 和  deleteHead,分别完成队列尾部插入结点 和 队列头部删除结点 AppendTail:直接将元素入栈stack1 DeleteHead:当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出 如果stack2为空,我们把stack1中的元素逐个弹出并入栈stack2,由于先进入队列的元素被压到stack1的底端,经过弹栈和压入stack2之后就处于stack2的顶端 1

两个队列实现栈

http://www.cnblogs.com/kaituorensheng/archive/2013/03/02/2939690.html //前提已知 typedef struct queue { int queuesize; int head, tail; int *q; }Queue; void InitQueue(Queue *q); void EnQueue(Queue *q, int key); int DeQueue(Queue *q); int SizeOfQueue(Queue