一:解析题目
一个黑箱里两个栈,调用时让黑箱能做队列使用。应该是不考虑两个栈各自的大小,如果有具体要求,再具体分析。
栈的特点是LIFO,队列的特点是FIFO。
栈的操作有push,pop。栈的顶端是S.top。
二:思路分析
1: 一个栈(S1)作为存储空间,一个栈(S2)作为临时空间。
2:考虑队列的上溢和下溢。
3:栈状态的分析,数据在S1,数据在S2。在S1时S[1]是先入的元素,在S[2]时S[S.top]是先入元素。
4:每执行一次入队或者出队操作,数据在S1,S2间挪转一次。
三:思路分析二
1,2点同上。
3:数据一直在S1中,入队操作直接压入S1,出队操作将S1除S[1]外的元素压入S2后弹出S[1],再将S2中的元素压回S1。
四:思路辨析
思路一的操作分别考虑数据在S1,S2时的入队,出队操作。在S1时入队直接push,在S2时出队直接pop。在S1时出队需要倒栈一次,在S2入队时需要倒栈一次。
思路二入队直接push,出队需要倒栈两次。
综合思路一更优。
五:伪代码实现
思路一:
ENQUEUE(Q,x)
{
if(S1.top == 0)
{ //数据在S2中或者S1,S2都为空栈,入栈需要倒栈一次
while(S2.top != 0)
{
temp = S2.top;
S2.pop;
PUSH(S1,temp);
}
PUSH(S1,x);
}else
{ //数组在S1中
if(S1.top == n)
{
error "overflow";
}else
PUSH(S1,x);
}
}
DEQUEUE(Q)
{
if(S1.top == 0 && S2.top == 0)
{
error "underflow" ;
}else
{
if(S1.top == 0)
{ //数据在S2中
POP(S2);
}else
{ //数据在S1中,只需要倒栈至S1中剩一个元素
while(S1.top != 1)
{
temp = S1.top;
S1.pop;
PUSH(S2,temp);
}
S1.pop;
}
}
}
java代码
public class TransStackToQueue{
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node){
if(stack1.empty()){
while(!stack2.empty()){
int temp = stack2.pop();
stack1.push(temp);
}
stack1.push(node);
}else{
stack1.push(node);
}
}
public int pop(){
int result = 0;
if(stack1.isEmpty() && stack2.isEmpty()){
System.out.println("underflow");
}else{
if(stack1.isEmpty()){
result = stack2.pop();
}else{
while(stack1.size() !=1){
int temp = stack1.pop();
stack2.push(temp);
}
result = stack1.pop();
}
}
return result;
}
}