当前位置: 首页 > 后端技术 > Python

LeetCode225-ImplementStackusingQueues

时间:2023-03-26 18:34:22 Python

题目:使用队列在栈上实现以下操作:push(x)--将元素x压入栈pop()--移除栈顶元素top()--获取栈顶元素empty()--返回栈是否为空使用queues实现栈的以下操作。push(x)--将元素x压入栈中。pop()--移除栈顶元素ofthestack.top()--获取栈顶元素。empty()--返回栈是否为空。示例:MyStackstack=newMyStack();stack.push(1);stack.push(2);堆栈顶部();//返回2stack.pop();//返回2stack.empty();//returnfalse注意:你只能使用队列的基本操作——即向后推、从前面查看/弹出、大小和为空这些操作是合法的。您的语言可能不支持队列。可以使用list或者deque(双端队列)来模拟一个队列,只要是标准的队列操作即可。您可以假设所有操作都是有效的(例如,不会在空堆栈上调用pop或top操作)注意:您必须仅使用队列的标准操作——这意味着只能向后推,从前面查看/弹出,size,和isempty操作是有效的。根据您的语言,队列可能不受本地支持。您可以使用列表或双端队列(双端队列)来模拟队列,只要您仅使用队列的标准操作。您可以假设所有操作都是有效的(例如,不会调用pop或top操作在空堆栈上)。解题思路:方法一(两个队列):队列先进先出,栈后进先出。用队列实现栈,可以使用两个队列来完成题解:入栈和出栈:入栈时使用queue1存放节点;出栈时,将queue1中的节点依次出队,放入队列到queue2中,直到queue1中最后剩下的元素为栈顶元素,弹出即可;获取栈顶元素:使用一个栈顶指针指向栈顶元素,top()方法在查询栈顶元素时可以直接返回栈顶指针。方法二(一个队列):只用一个队列,入栈时队列只需要反转:入栈并存入队列队列节点1入栈:队列:1反转队列0次:队列:1节点2栈队列:1->2反向队列1次:队列:1->2-->队列:2->1节点2栈队列:2->1->3反向queue2次:queue:2->1->3--->queue:1->3->2--->queue:3->2->1...这样无论什么时候的顺序队伍是按照popping的顺序。Java:方法一类MyStack{Queuequeue1;队列<整数>队列2;privateinttop;//指向栈顶元素publicMyStack(){queue1=newLinkedList<>();queue2=新链表<>();}publicvoidpush(intx){queue1.offer(x);top=x;//新加入的元素为栈顶元素}publicintpop(){while(queue1.size()>1){//条件是队列1的元素个数较大thanonetop=queue1.poll();//使用top暂存元素,当循环结束时,top只是栈顶元素queue2.add(top);}//queue1ExchangeQueue与queue2tmp=queue2;队列2=队列1;队列1=tmp;returnqueue2.poll();//返回队列2的队列头元素,队列2也只有一个元素}publicinttop(){returntop;}publicbooleanempty(){returnqueue1.isEmpty();//队列1判断入栈是否为空}}方法二:每次入队就倒序,只有入栈需要特殊操作,出栈,取栈顶元素,是否为空,都是按照正常的出队方法执行,取队头元素,是否为空。下面是入栈时的代码:Queuequeue=newLinkedList<>();publicvoidpush(intx){queue.add(x);intsz=queue.size();//获取队列的长度while(sz>1){//反转次数为队列长度减一queue.add(queue.remove());//反转sz--;}}Python:Python语言没有栈和队列数据结构,仅用数组List或双端队列deque实现。这种编程语言根本不需要用队列来实现栈或者用栈来实现队列,因为栈和队列必须用List和deque来实现。所以这道题在这门语言里很简单,可以说是作弊了。MyStack类:def__init__(self):自我。stack=[]defpush(self,x:int)->无:self.堆。append(x)defpop(self)->int:返回自我。堆。pop(-1)deftop(self)->int:returnself.stack[-1]defempty(self)->bool:返回非self.stack