【发布时间】:2015-08-07 08:26:44
【问题描述】:
如何在一个数组 A[1..n] 中实现两个堆栈,除非堆栈总数不溢出,否则堆栈不会溢出。两个堆栈中的元素加在一起是 n。 PUSH 和 POP 应该在 O(1) 时间内运行?
这个算法有什么问题?
//A[1...n], top1 is pointer pointing to top of stack1.
top1=-1;
top2=-1;
STACK-EMPTY(A)
1. if(top1==0 && top2==0)
2. return 1
3. else
4. return 0
STACK-FULL(A)
1. if(top1==S1.length && top2==S1.length)
2. return 1
3. else if(top1==S1.length)
4. return -1
5. else if(top2==S2.length)
6. return -2
7. else
8. return 0
PUSH (A,x)
1. if(!STACK-FULL())
2. if(STACK-FULL()==-1)
3. top2=top2+1
4. S2[top2]=x
5. else if(STACK-FULL()==-2)
6. top1=top1+1
7. S1[top1]=x
8. else
9. top1=top1+1
10. S1[top1]=x
11. else
12. OVERFLOW
【问题讨论】:
-
从两端填充数组。顶部 1 = 1 和顶部 2 = n。当使用 top1 = top2 调用 PUSH 时,溢出。 POP1只需递减top1,POP2只需递增POP2即可。
-
我知道..但我正在搜索“一个数组两个堆栈..”的另一种实现。所以我问“这个算法是否满足上述 O(1) 时间和溢出条件”?
-
STACK-FULL 的第 1 行没有意义
-
是的..对不起..打字错误.. if(top1==S1.length && top2==S2.length)
-
修正你的格式!编辑您的问题并将代码格式化为普通代码,而不是使用编号列表。如果缩进第 4 行或更多空格,它们将显示为代码。如果您希望人们阅读并回答您的问题,请花一些时间阅读编辑帮助。
标签: arrays data-structures stack