我一直在考虑程序逻辑,但我不能对我的问题得出结论。
在这里,我已经对固定数组实现了堆栈和队列操作。
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 或者根本没有答案。
答案 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会获得第一个添加的项目。