算法_栈实现队列篇
Posted 葡萄籽-June
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法_栈实现队列篇相关的知识,希望对你有一定的参考价值。
用2个栈实现队列
本篇算法主要是通过栈的特性实现队列的思想。
前言
简单描述栈与队列的概念等内容。
栈特点:
(1)栈只能从表的一端存取数据,另一端是封闭的。(只能在栈顶进行删除(pop),插入(push)操作。)
(2)在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。
队列特点:
(1)队列访问元素的顺序不是后进先出(LIFO),而是先进先出(FIFO)。
(2)当一个元素被添加到队列中时,它被添加到后面。当一个元素从队列中移除时,它将从前面移除。队列的两个主要操作就是入队(enqueue)和出队(dequeue)。
一、题目(两个栈来实现一个队列)
用两个栈来实现一个队列: 分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
示例:
输入: ["PSH1","PSH2","POP","POP"]
返回: 1,2
解析:
"PSH1":代表将1插入队列尾部
"PSH2":代表将2插入队列尾部
"POP“:代表删除一个元素,先进先出=>返回1
"POP“:代表删除一个元素,先进先出=>返回2
思路:
1、根据栈的特性以及相应的队列的特性可知,需把栈的先进后出转变为先进先出。
2、如何用2个栈将先进后出的特性转为先进先出,大致思路如下图所示:
二、实现代码
/**
* 两个栈实现一个队列
*/
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
// 主函数入口
public static void main(String[] args) {
StackImplQueue stackImplQueue = new StackImplQueue();
String[] arr = {"PSH1", "PSH2", "POP", "POP"};
// System.out.println(arr[0].substring(0,3).equals("PSH"));
// 截取字符串
for (int i = 0; i < arr.length; i++) {
String pushInvalid = arr[i].substring(0, 3);
// 判断是否是PSH,若是则执行push操作
if (pushInvalid.equals("PSH")) {
// 截取PSH后的数字并转为int类型放入栈中
int pushNum = Integer.parseInt(arr[i].substring(3));
stackImplQueue.push(pushNum);
} else if (pushInvalid.equals("POP")) {
// 判断是否是POP,若是则执行pop操作
stackImplQueue.pop();
} else {
System.out.println("输入格式不符合要求~");
}
}
}
/**
* 尾部插入内容,插入整数
*/
public void push(int node) {
stack1.push(node);
}
/**
* 头部删除内容
* need:0 则进行出栈操作
*/
public void pop() {
//判断栈1为不为空
while (!stack1.isEmpty()) {
//将栈1中的所有数放入到栈2中
stack2.push(stack1.pop());
}
if (!stack2.isEmpty()) {
//栈2栈顶元素出栈
int x = stack2.pop();
System.out.println(x);
}
//判断栈2为不为空
while (!stack2.isEmpty()) {
//将栈2剩余的元素放入到栈1中
stack1.push(stack2.pop());
}
}
以上是关于算法_栈实现队列篇的主要内容,如果未能解决你的问题,请参考以下文章