Day 5:用两个栈实现队列

时间:2022-07-24
本文章向大家介绍Day 5:用两个栈实现队列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——用两个栈实现队列

题目描述:

用两个栈来实现一个队列,完成队列的push和pop操作。队列中的元素为int类型

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体思路:

背景知识介绍:   栈和队列是数据结构中的线性结构中的两种;其中栈是具有“先进后出”的特点,队列是具有“先进先出”的特性。并且他们的存储都有两种形式:顺序存储和链式存储。并且在本题中会用到这些方式: 1、pop():移除栈顶,并作为返回值返回给函数。 2、push(element):入栈 3、isEmpty() 判断是否为空 具体实现思路:   刚才我们介绍栈“先进后出”,队列是先进先出;如果实现队列的功能的话,我们可以用两个栈来模拟实现队列的操作; 具体我们分别用java和python来实现这一思路 1、首先我们用java来实现

import java.util.Stack;
public class Solution{
	Stack<Integer> stack1 = new Stack<Integer>();
	Stack<Integer> stack2 = new Stack<Integer>();
	public void push(int node){
	    stack1.push(node);
	}
	public int pop(){
		while(!stack1.isEmpty()){
			stack2.push(stack1.pop());
		}
			int out = stack2.pop();
			while(!stack2.isEmpty()){
				stack1.push(stack2.pop());
			}
			return out;
	}
}

其效果如图所示:

2、接下来用python将其实现

class Solution:
	def __init__(self):
		self.stack1 = []
		self.stack2 = []
	def push(self, node):
		self.stack1.append(node)
	def pop(self):
		try:
			_pop = self.stack2.pop()
		except IndexError as e:
			if len(self.stack1) != 0:
				for i in range (len(self.stack1)):
					self.stack2.append(self.stack1.pop())
				_pop = self.stack2.pop()
			else:
				_pop = None
		return _pop

其效果如图所示:

要想看代码的运行效果,我们可以加上main();具体实现如下:

if __name__ == '__main__':
	s = Solution()
	s.push(1)
	s.push(2)
    s.push(3)
    s.push(4)
    s.push(5)
    s.push(6)
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())
    s.push(7)
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())
    print(s.pop())

其代码运行结果如下:

总结

  本道题主要考察栈和队列,难度系数较低,在做题之前,我们应该知道栈和队列的基本操作,包括栈的出栈、入栈、以及栈的一些存储结构,并且知道两个栈可以模仿队列的基本操作,这是基于栈的“先进后出”的特性;两个栈刚好模仿了队列“先进先出”的操作。继续加油,争取早日找到工作,Good Luck!!!