漫画:如何用栈实现队列?
————— 第二天 —————————————————栈的特点是先入后出,出入元素都是在同一端(栈顶):入栈:出栈:队列的特点是先入先出,出入元素是在不同的两端(队头...



————— 第二天 —————









————————————




栈的特点是先入后出,出入元素都是在同一端(栈顶):
入栈:

出栈:

队列的特点是先入先出,出入元素是在不同的两端(队头和队尾):
入队:

出队:

既然我们拥有两个栈,那么我们可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老元素。



队列的主要操作无非有两个:入队和出队。
在模拟入队操作时,每一个新元素都被压入到栈 A 当中。
让元素 1 “入队”:


让元素 2 “入队”:


让元素 3 “入队”:


这时候,我们希望最先“入队”的元素 1 “出队”,需要怎么做呢?
让栈 A 中的所有元素按顺序出栈,再按照出栈顺序压入栈 B。这样一来,元素从栈 A 弹出并压入栈 B 的顺序是 3,2,1,和当初进入栈 A 的顺序 1,2,3 是相反的:

此时让元素 1 “出队”,也就是让元素 1 从栈 B 弹出:

让元素 2 “出队”:



让元素 4 “入队”:


此时的出队操作仍然从栈 B 弹出元素。
让元素 3 “出队”:




让元素 4 “出队”:




-
private Stack<Integer> stackA = new Stack<Integer>(); -
private Stack<Integer> stackB = new Stack<Integer>(); -
-
-
/** -
* 入队操作 -
* @param element 入队的元素 -
*/ -
public void enQueue(int element) { -
stackA.push(element); -
} -
-
-
/** -
* 出队操作 -
*/ -
public Integer deQueue() { -
if(stackB.isEmpty()){ -
if(stackA.isEmpty()){ -
return null; -
} -
transfer(); -
} -
return stackB.pop(); -
} -
-
-
/** -
* 栈A元素转移到栈B -
*/ -
private void transfer(){ -
while (!stackA.isEmpty()){ -
stackB.push(stackA.pop()); -
} -
} -
-
-
public static void main(String[] args) throws Exception { -
StackQueue stackQueue = new StackQueue(); -
stackQueue.enQueue(1); -
stackQueue.enQueue(2); -
stackQueue.enQueue(3); -
System.out.println(stackQueue.deQueue()); -
System.out.println(stackQueue.deQueue()); -
stackQueue.enQueue(4); -
System.out.println(stackQueue.deQueue()); -
System.out.println(stackQueue.deQueue()); -
}



声明:本文为作者投稿,首发于个人公众号程序员小灰,版权归其所有。
热 文 推 荐

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
点击“阅读原文”,打开 CSDN App 阅读更贴心!
喜欢就点击“好看”吧
更多推荐



所有评论(0)