使用2个队列实现堆栈

专家新手

此代码为何起作用:

#include <cstdio>
#include <cstdlib>

#define N n *
#define Q q *
#define S s *

typedef struct n
{
    int data;
    struct N nxt;
}n;

typedef struct q
{
    N f;
    N r;
}q;

typedef struct stack
{
    Q q1;
    Q q2;
}s;
Q Createq()
{
    Q qq = (Q)malloc(sizeof(q));
    qq->f = qq->r  = 0;
    return qq;
}

S CreateStk()
{
    S stk = (S)malloc(sizeof(s));
    stk->q1 = Createq();
    stk->q2 = Createq();
    return stk;
}

int Deq(Q qq)
{
    if(qq->f == 0 && qq->r == 0) return -1;
    N nn = qq->r;
    int data = nn->data;
    qq->r = qq->r->nxt;
    free(nn);
    if(!qq->r)
        qq->f = 0;
    return data;
}

void Enq(Q qq, int data)
{
    if(!qq->f)
    {
        N nn = (N)malloc(sizeof(n));
        nn->data = data;
        nn->nxt = 0;
        qq->f = qq->r = nn;
    }
    else
    {
        N nn = (N)malloc(sizeof(n));
        nn->data = data;
        nn->nxt = 0;
        qq->f->nxt = nn;
        qq->f = nn;
    }
}

void Push(S stk, int data)
{
    Enq(stk->q2,data);

    while(stk->q1->f)
    {
        Enq(stk->q2,Deq(stk->q1));
    }

    Q t = stk->q1;
    stk->q1 = stk->q2;
    stk->q2 = t;
}

int Pop(S stk)
{
    return Deq(stk->q1);
}
int main() 
{
    S stk = CreateStk();
    Push(stk,10);
    Push(stk,30);
    Push(stk,40);
    Push(stk,50);
    printf("\nPopped: %d.", Pop(stk));
    printf("\nPopped: %d.", Pop(stk));
    printf("\nPopped: %d.", Pop(stk));
    printf("\nPopped: %d.", Pop(stk));
    return 0;
    return 0;
}

输出:

Popped: 50.
Popped: 40.
Popped: 30.
Popped: 10.

虽然这不是:

#include <cstdio>
#include <cstdlib>

#define N n *
#define Q q *

typedef struct n
{
    int data;
    struct N nxt;
}n;

typedef struct q
{
    N f;
    N r;
}q;

Q Createq()
{
    Q qq = (Q)malloc(sizeof(q));
    qq->f = qq->r  = 0;
    return qq;
}

int Deq(Q qq)
{
    if(qq->f == 0 && qq->r == 0) return -1;
    N nn = qq->r;
    int data = nn->data;
    qq->r = qq->r->nxt;
    free(nn);
    if(!qq->r)
        qq->f = 0;
    return data;
}

void Enq(Q qq, int data)
{
    if(!qq->f)
    {
        N nn = (N)malloc(sizeof(n));
        nn->data = data;
        nn->nxt = 0;
        qq->f = qq->r = nn;
    }
    else
    {
        N nn = (N)malloc(sizeof(n));
        nn->data = data;
        nn->nxt = 0;
        qq->f->nxt = nn;
        qq->f = nn;
    }
}

void Push(Q qq1, Q qq2, int data)
{
    Enq(qq2,data);

    while(qq1->f)
    {
        Enq(qq2,Deq(qq1));
    }

    Q t = qq1;
    qq1 = qq2;
    qq2 = t;
}

int Pop(Q qq1)
{
    return Deq(qq1);
}

int main() {
    // your code goes here
    Q qq1 = Createq();
    Q qq2 = Createq();
    Push(qq1,qq2,10);
    Push(qq1,qq2,30);
    Push(qq1,qq2,40);
    Push(qq1,qq2,50);
    printf("\nPopped: %d.", Pop(qq1));
    printf("\nPopped: %d.", Pop(qq1));
    printf("\nPopped: %d.", Pop(qq1));
    printf("\nPopped: %d.", Pop(qq1));
    return 0;
}

输出:

弹出:-1。弹出:-1。弹出:-1。弹出:-1。

从问题标题可以明显看出,期望的输出是第一个。但是,当我在第二个示例中未将2个队列封装在结构中时,我不理解为什么代码无法正常工作的细节。

PS:我认为问题出在Push方法上-但不确定出了什么问题。

黑暗

除了难以理解之外,问题还在于您的第二个Push函数在以下代码行中更改了其参数的值。

Q t = qq1;
qq1 = qq2;
qq2 = t;

qq1qq2是函数的参数,因此新值不会在调用函数(main)中更新

解决此问题的一种方法是使参数通过引用传递:

void Push(Q &qq1, Q &qq2, int data)

通过这种方式,改变为qq1qq2也将改变调用函数的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用2个堆栈实现队列

来自分类Dev

您将使用什么来实现两个堆栈队列?基于数组的堆栈还是链表堆栈?两个队列堆栈呢?

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

仅使用一个堆栈实现优先级队列

来自分类Dev

如何实现具有两个堆栈的队列

来自分类Dev

堆栈和队列:使用数组更容易实现?

来自分类Dev

如何使用优先级队列实现堆栈?

来自分类Dev

我正在尝试实现一个队列,该队列将反转生成的堆栈并打印堆栈FIFO?

来自分类Dev

为什么要使用链接列表而不是数组或向量实现来实现堆栈或队列?

来自分类Dev

通常如何实现队列和堆栈?

来自分类Dev

stl堆栈和队列的内部实现

来自分类Dev

C ++ | 使用STL双端队列和适配器设计实现堆栈

来自分类Dev

使用数组实现堆栈

来自分类Dev

如何使用两个队列实现优先级队列

来自分类Dev

如何使用两个队列实现优先级队列

来自分类Dev

当我需要使用两个堆栈来形成队列时,如何检查队列是否为空?

来自分类Dev

尝试实现无锁队列时堆栈溢出

来自分类Dev

使用链表实现错误队列

来自分类Dev

使用堆栈实施队列(JAVA)时出错

来自分类Dev

使用堆栈实施队列(JAVA)时出错

来自分类Dev

使用函数调用实现堆栈

来自分类Dev

使用链表实现堆栈损坏

来自分类Dev

使用 o(1) 实现堆栈

来自分类Dev

2个对象使用相同的名称创建串行队列时是否共享相同的队列

来自分类Dev

使用数组的第一个元素作为顶部实现堆栈

来自分类Dev

使用链表实现优先级队列

来自分类Dev

如何:实现BatchMessageListenerContainer以批量使用JMS队列

来自分类Dev

使用链表的队列实现:C#

Related 相关文章

热门标签

归档