在同一阵列上进行堆栈和队列操作

时间:2010-04-18 16:07:12

标签: c++ algorithm

我一直在考虑程序逻辑,但我不能对我的问题得出结论。

在这里,我已经对固定数组实现了堆栈和队列操作。

int A[1000];
int size=1000;

int top;

int front;
int rear;

bool StackIsEmpty()
{
    return (top==0);
}

bool StackPush( int x )
{
    if ( top >= size ) return false;
    A[top++] = x;
    return true;
}

int StackTop( )
{
    return A[top-1];
}

bool StackPop()
{
    if ( top <= 0 ) return false;
    A[--top] = 0;
    return true;
}

bool QueueIsEmpty()
{
    return (front==rear);
}

bool QueuePush( int x )
{
    if ( rear >= size ) return false;
    A[rear++] = x;
    return true;
}

int QueueFront( )
{
    return A[front];
}

bool QueuePop()
{
    if ( front >= rear ) return false;
    A[front++] = 0;
    return true;
}

假定(或显而易见)堆栈的底部和队列的前端指向相同的位置,反之亦然(堆栈的顶部指向与队列后部相同的位置)。

例如,整数1和2按写入顺序位于数组内。如果我调用StackPop(),则会弹出整数2,如果我调用QueuePop(),则会弹出整数1。

我的问题是,我不知道如果我在同一个数组上进行堆栈和队列操作会发生什么。上面的例子很容易解决,因为只涉及两个值。但如果涉及的值超过2个怎么办?

例如,如果我打电话

StackPush(1);
QueuePush(2);
QueuePush(4);
StackPop();
StackPush(5);
QueuePop();

将从最终数组的底部(前面)的顺序返回什么值?

我知道如果我编写一个程序,我会得到一个快速回答。但我之所以这么说,是因为我想听到人类的逻辑解释,而不是计算机。

增加: 对于第二个例子,我有4个候选人。     25     12     24     45 或者根本没有答案。

4 个答案:

答案 0 :(得分:2)

为什么要在同一个阵列上实现这些?如果你这样做的话,一个结构的元素可能会覆盖另一个结构的元素。

然而,你基本上有(类似的东西)deque,但是手动运行你的程序是很困难的,因为你有两个数据结构的不同指针,但两个数据结构只有一个数组。

  

假定(或显而易见)堆栈的底部和队列的前端指向相同的位置,反之亦然(堆栈的顶部指向与队列后部相同的位置)。

嗯,好的,在这种情况下,你应该只使用Deque,这在这个假设下不起作用。或者为队列和堆栈使用不同的向量。

一般来说,人类这就是计算机如何做到这一点。只需让你的程序在每次操作后打印A的内容,它就足够合理了。

答案 1 :(得分:1)

我不确定你要解决的确切问题,但这看起来非常像double-ended queue。根据您尝试解决的问题,circular buffer可能值得研究。

查看这些经过验证的数据结构,至少为自己提供更多实现自己数据结构的上下文,希望其中一个是你所追求的。

答案 2 :(得分:1)

对于您的代码,由于堆栈例程和队列例程维护不同的变量以便推送到哪里,它可能无法达到您的预期。

StackPush(1);   // place 1 at position 0; increase top of stack to 1
QueuePush(2);   // place 2 at position 0; increase rear of queue to 1
QueuePush(4);   // place 4 at position 1; increase rear of queue to 2
StackPop();     // get value(2) from position 0; decrease top of stack to 0
StackPush(5);   // place 5 at position 0; increase top of stack to 1
QueuePop();     // get value(5) from position 0; increase front of queue to 1

如果您改为编写代码以便堆栈使用rear而不是top,那么您会看到这些结果。

StackPush(1);   // place 1 at position 0; increase rear to 1
QueuePush(2);   // place 2 at position 1; increase rear to 2
QueuePush(4);   // place 4 at position 2; increase rear to 3
StackPop();     // get value(4) from position 2; decrease rear to 2
StackPush(5);   // place 5 at position 2; increase rear to 3
QueuePop();     // get value(1) from position 0; increase front to 1

答案 3 :(得分:0)

结果将是4和1,因为数组有1 2 4,当你说堆栈弹出它得到最近添加的项目是4.当堆栈推送5后,数组将是1 2 5然后当你从队列中弹出时,你会得到1,因为队列pop会获得第一个添加的项目。