• LeetCode第232题—用栈实现队列


    本次写的题目是用栈实现队列,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

    🌱分析阶段

    本题与LeetCode第225题——用队列实践栈的思路大同小异。

    本题题目十分清晰,就是通过利用栈来实现队列的功能。

    我们都知道队列的特点是先进先出,而栈的特点却是先进后出,完全相反的两个特点。所以要想单凭一个栈是无法实现模仿的,在这里我们先用两个栈来尝试一下。这个过程自己画图做思考。 

    在简单的尝试后,我们发现其是可行的。只需要创建两个栈,分别命名为stack1和stack2。其中stack1用于专门放入元素,stack2用于专门出元素。每当进元素就进入stack1,然后如果stack2是空的,就把stack1中的全部元素倒过去,此时若还要入元素,继续放入stack1,然后如果要出,若stack2中还有元素,就先不要从stack1里面倒过去,直至stack2中出元素出空了之后,若还要出,这是才从stack1里面出出来。图示如下👇:

    问题思路较为清晰,到此时已经分析的较为清楚了,接下来让我们直接进入代码阶段吧😎


    🌱代码阶段 

    我们按照一个一个函数来进行代码编写。首先是要创建两个栈,分别命名为stack1和stack2,如下代码👇:

    1. import java.util.*;
    2. class MyQueue {
    3. public Stack stack1 = new Stack<>();
    4. public Stack stack2 = new Stack<>();
    5. public MyQueue() {
    6. }
    7. public void push(int x) {
    8. }
    9. public int pop() {
    10. }
    11. public int peek() {
    12. }
    13. public boolean empty() {
    14. }
    15. }

    🍃push函数

    push函数特别简单,只需要将要放入的元素放入stack1就好。具体代码如下👇:

    1. import java.util.*;
    2. class MyQueue {
    3. public Stack stack1 = new Stack<>();
    4. public Stack stack2 = new Stack<>();
    5. public MyQueue() {
    6. }
    7. public void push(int x) {
    8. stack1.push(x);
    9. }
    10. //其他未写函数省略
    11. }

    🍃pop函数

    根据前面分析:若stack2为空的时候,需要判断stack1中有没有元素,若有元素则将stack1中的所有元素倒入stack2中,然后返回并弹出stack2的栈顶元素;若stack2不为空,则返回并弹出stack2的栈顶元素。具体代码如下👇:

    1. import java.util.*;
    2. class MyQueue {
    3. public Stack stack1 = new Stack<>();
    4. public Stack stack2 = new Stack<>();
    5. public MyQueue() {
    6. }
    7. public void push(int x) {
    8. stack1.push(x);
    9. }
    10. public int pop() {
    11. if(stack2.empty()){ //当stack2为空时
    12. while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
    13. stack2.push(stack1.pop());
    14. }
    15. }
    16. return stack2.pop();
    17. }
    18. //其他未写函数省略
    19. }

    🍃peek函数

    peek函数的思路与pop函数的思路差不多,我们只需要将最后的返回并弹出stack2的栈顶元素改为👉返回stack2的栈顶元素,但是不弹出。即可。具体代码如下👇:

    1. import java.util.*;
    2. class MyQueue {
    3. public Stack stack1 = new Stack<>();
    4. public Stack stack2 = new Stack<>();
    5. public MyQueue() {
    6. }
    7. public void push(int x) {
    8. stack1.push(x);
    9. }
    10. public int pop() {
    11. if(stack2.empty()){ //当stack2为空时
    12. while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
    13. stack2.push(stack1.pop());
    14. }
    15. }
    16. return stack2.pop();
    17. }
    18. public int peek() { //与pop的思路差不多
    19. if(stack2.empty()){ //当stack2为空时
    20. while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
    21. stack2.push(stack1.pop());
    22. }
    23. return stack2.peek();
    24. }else{
    25. return stack2.peek();
    26. }
    27. }
    28. //其他未写函数省略
    29. }

    🍃empty函数

    要判断是否为空,我们只需要判断stack1和stack2是不是同时为空就好😎具体代码如下👇:

    1. import java.util.*;
    2. class MyQueue {
    3. public Stack stack1 = new Stack<>();
    4. public Stack stack2 = new Stack<>();
    5. public MyQueue() {
    6. }
    7. public void push(int x) {
    8. stack1.push(x);
    9. }
    10. public int pop() {
    11. if(stack2.empty()){ //当stack2为空时
    12. while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
    13. stack2.push(stack1.pop());
    14. }
    15. }
    16. return stack2.pop();
    17. }
    18. public int peek() { //与pop的思路差不多
    19. if(stack2.empty()){ //当stack2为空时
    20. while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
    21. stack2.push(stack1.pop());
    22. }
    23. return stack2.peek();
    24. }else{
    25. return stack2.peek();
    26. }
    27. }
    28. public boolean empty() {
    29. return stack1.empty()&&stack2.empty();
    30. }
    31. }

    以上,便是全部代码啦😎让我们来运行一下逝逝~

    nice😎✨

  • 相关阅读:
    国际腾讯云:云服务器疑似被病毒入侵问题解决方案!!!
    金九银十准备季:Java IO流面试题(含答案)
    【SpringMVC】自定义注解
    【数据分析】京东订单数据分析思路及Python代码
    matplotlib图表常用设置(四)
    二、SpringBoot自动装配及SPI的理解
    单向循环代码实现cpp
    设计模式02 结构型模式
    四、Mediasoup Js和 C++ 管道通信的过程
    通过QGIS下载高程数据并进行矢量数据高程的计算
  • 原文地址:https://blog.csdn.net/Green_756/article/details/126571568