Update stack and queue.
This commit is contained in:
		| @@ -38,35 +38,34 @@ comments: true | ||||
|     ```java title="deque.java" | ||||
|     /* 初始化双向队列 */ | ||||
|     Deque<Integer> deque = new LinkedList<>(); | ||||
|      | ||||
|  | ||||
|     /* 元素入队 */ | ||||
|     deque.offerLast(2); | ||||
|     deque.offerLast(5); | ||||
|     deque.offerLast(4); | ||||
|     deque.offerFirst(3); | ||||
|     deque.offerFirst(1); | ||||
|     System.out.println("队列 deque = " + deque); | ||||
|      | ||||
|     System.out.println("双向队列 deque = " + deque); | ||||
|  | ||||
|     /* 访问队首元素 */ | ||||
|     int peekFirst = deque.peekFirst(); | ||||
|     System.out.println("队首元素 peekFirst = " + peekFirst); | ||||
|     int peekLast = deque.peekLast(); | ||||
|     System.out.println("队尾元素 peekLast = " + peekLast); | ||||
|      | ||||
|  | ||||
|     /* 元素出队 */ | ||||
|     int pollFirst = deque.pollFirst(); | ||||
|     System.out.println("队首出队元素 pollFirst = " + pollFirst +  | ||||
|                      ",队首出队后 deque = " + deque); | ||||
|     System.out.println("队首出队元素 pollFirst = " + pollFirst + ",队首出队后 deque = " + deque); | ||||
|     int pollLast = deque.pollLast(); | ||||
|     System.out.println("队尾出队元素 pollLast = " + pollLast +  | ||||
|                      ",队尾出队后 deque = " + deque); | ||||
|      | ||||
|     /* 获取队列的长度 */ | ||||
|     System.out.println("队尾出队元素 pollLast = " + pollLast + ",队尾出队后 deque = " + deque); | ||||
|  | ||||
|     /* 获取双向队列的长度 */ | ||||
|     int size = deque.size(); | ||||
|     System.out.println("队列长度 size = " + size); | ||||
|      | ||||
|     /* 判断队列是否为空 */ | ||||
|     System.out.println("双向队列长度 size = " + size); | ||||
|  | ||||
|     /* 判断双向队列是否为空 */ | ||||
|     boolean isEmpty = deque.isEmpty(); | ||||
|     System.out.println("双向队列是否为空 = " + isEmpty); | ||||
|     ``` | ||||
|  | ||||
| === "C++" | ||||
|   | ||||
| @@ -60,6 +60,7 @@ comments: true | ||||
|  | ||||
|     /* 判断队列是否为空 */ | ||||
|     boolean isEmpty = queue.isEmpty(); | ||||
|     System.out.println("队列是否为空 = " + isEmpty); | ||||
|     ``` | ||||
|  | ||||
| === "C++" | ||||
| @@ -145,10 +146,9 @@ comments: true | ||||
|     ```java title="array_queue.java" | ||||
|     /* 基于环形数组实现的队列 */ | ||||
|     class ArrayQueue { | ||||
|         int[] nums; // 用于存储队列元素的数组 | ||||
|         int size = 0; // 队列长度(即元素个数) | ||||
|         int front = 0; // 头指针,指向队首 | ||||
|         int rear = 0; // 尾指针,指向队尾 + 1 | ||||
|         private int[] nums;     // 用于存储队列元素的数组 | ||||
|         private int front = 0;  // 头指针,指向队首 | ||||
|         private int rear = 0;   // 尾指针,指向队尾 + 1 | ||||
|  | ||||
|         public ArrayQueue(int capacity) { | ||||
|             // 初始化数组 | ||||
|   | ||||
| @@ -36,22 +36,23 @@ comments: true | ||||
|  | ||||
|     ```java title="stack.java" | ||||
|     /* 初始化栈 */ | ||||
|     Stack<Integer> stack = new Stack<>(); | ||||
|     // 在 Java 中,推荐将 LinkedList 当作栈来使用 | ||||
|     LinkedList<Integer> stack = new LinkedList<>(); | ||||
|  | ||||
|     /* 元素入栈 */ | ||||
|     stack.push(1); | ||||
|     stack.push(3); | ||||
|     stack.push(2); | ||||
|     stack.push(5); | ||||
|     stack.push(4); | ||||
|     stack.addLast(1); | ||||
|     stack.addLast(3); | ||||
|     stack.addLast(2); | ||||
|     stack.addLast(5); | ||||
|     stack.addLast(4); | ||||
|     System.out.println("栈 stack = " + stack); | ||||
|  | ||||
|     /* 访问栈顶元素 */ | ||||
|     int peek = stack.peek(); | ||||
|     int peek = stack.peekLast(); | ||||
|     System.out.println("栈顶元素 peek = " + peek); | ||||
|  | ||||
|     /* 元素出栈 */ | ||||
|     int pop = stack.pop(); | ||||
|     int pop = stack.removeLast(); | ||||
|     System.out.println("出栈元素 pop = " + pop + ",出栈后 stack = " + stack); | ||||
|  | ||||
|     /* 获取栈的长度 */ | ||||
| @@ -60,18 +61,73 @@ comments: true | ||||
|  | ||||
|     /* 判断是否为空 */ | ||||
|     boolean isEmpty = stack.isEmpty(); | ||||
|     System.out.println("栈是否为空 = " + isEmpty); | ||||
|     ``` | ||||
|  | ||||
| === "C++" | ||||
|  | ||||
|     ```cpp title="stack.cpp" | ||||
|      | ||||
|     /* 初始化栈 */ | ||||
|     stack<int> stack; | ||||
|  | ||||
|     /* 元素入栈 */ | ||||
|     stack.push(1); | ||||
|     stack.push(3); | ||||
|     stack.push(2); | ||||
|     stack.push(5); | ||||
|     stack.push(4); | ||||
|     cout << "栈 stack = "; | ||||
|     PrintUtil::printStack(stack); | ||||
|  | ||||
|     /* 访问栈顶元素 */ | ||||
|     int top = stack.top(); | ||||
|     cout << "栈顶元素 top = " << top << endl; | ||||
|  | ||||
|     /* 元素出栈 */ | ||||
|     stack.pop(); | ||||
|     cout << "出栈元素 pop = " << top << ",出栈后 stack = "; | ||||
|     PrintUtil::printStack(stack); | ||||
|  | ||||
|     /* 获取栈的长度 */ | ||||
|     int size = stack.size(); | ||||
|     cout << "栈的长度 size = " << size << endl; | ||||
|  | ||||
|     /* 判断是否为空 */ | ||||
|     bool empty = stack.empty(); | ||||
|     cout << "栈是否为空 = " << empty << endl; | ||||
|     ``` | ||||
|  | ||||
| === "Python" | ||||
|  | ||||
|     ```python title="stack.py" | ||||
|      | ||||
|     """ 初始化栈 """ | ||||
|     # Python 没有内置的栈类,可以把 list 当作栈来使用  | ||||
|     stack = [] | ||||
|  | ||||
|     """ 元素入栈 """ | ||||
|     stack.append(1) | ||||
|     stack.append(3) | ||||
|     stack.append(2) | ||||
|     stack.append(5) | ||||
|     stack.append(4) | ||||
|     print("栈 stack =", stack) | ||||
|  | ||||
|     """ 访问栈顶元素 """ | ||||
|     peek = stack[-1] | ||||
|     print("栈顶元素 peek =", peek) | ||||
|  | ||||
|     """ 元素出栈 """ | ||||
|     pop = stack.pop() | ||||
|     print("出栈元素 pop =", pop) | ||||
|     print("出栈后 stack =", stack) | ||||
|  | ||||
|     """ 获取栈的长度 """ | ||||
|     size = len(stack) | ||||
|     print("栈的长度 size =", size) | ||||
|  | ||||
|     """ 判断是否为空 """ | ||||
|     is_empty = len(stack) == 0 | ||||
|     print("栈是否为空 =", is_empty) | ||||
|     ``` | ||||
|  | ||||
| ## 栈的实现 | ||||
| @@ -91,14 +147,15 @@ comments: true | ||||
|     ```java title="linkedlist_stack.java" | ||||
|     /* 基于链表实现的栈 */ | ||||
|     class LinkedListStack { | ||||
|         LinkedList<Integer> list; | ||||
|         private ListNode stackPeek;  // 将头结点作为栈顶 | ||||
|         private int stackSize = 0;   // 栈的长度 | ||||
|          | ||||
|         public LinkedListStack() { | ||||
|             // 初始化链表 | ||||
|             list = new LinkedList<>(); | ||||
|             stackPeek = null; | ||||
|         } | ||||
|         /* 获取栈的长度 */ | ||||
|         public int size() { | ||||
|             return list.size(); | ||||
|             return stackSize; | ||||
|         } | ||||
|         /* 判断栈是否为空 */ | ||||
|         public boolean isEmpty() { | ||||
| @@ -106,15 +163,25 @@ comments: true | ||||
|         } | ||||
|         /* 入栈 */ | ||||
|         public void push(int num) { | ||||
|             list.addLast(num); | ||||
|             ListNode node = new ListNode(num); | ||||
|             node.next = stackPeek; | ||||
|             stackPeek = node; | ||||
|             stackSize++; | ||||
|         } | ||||
|         /* 出栈 */ | ||||
|         public int pop() { | ||||
|             return list.removeLast(); | ||||
|             if (size() == 0) | ||||
|                 throw new IndexOutOfBoundsException(); | ||||
|             int num = peek(); | ||||
|             stackPeek = stackPeek.next; | ||||
|             stackSize--; | ||||
|             return num; | ||||
|         } | ||||
|         /* 访问栈顶元素 */ | ||||
|         public int peek() { | ||||
|             return list.getLast(); | ||||
|             if (size() == 0) | ||||
|                 throw new IndexOutOfBoundsException(); | ||||
|             return stackPeek.val; | ||||
|         } | ||||
|     } | ||||
|     ``` | ||||
| @@ -122,13 +189,88 @@ comments: true | ||||
| === "C++" | ||||
|  | ||||
|     ```cpp title="linkedlist_stack.cpp" | ||||
|      | ||||
|     /* 基于链表实现的栈 */ | ||||
|     class LinkedListStack { | ||||
|     private: | ||||
|         ListNode* stackTop; // 将头结点作为栈顶 | ||||
|         int stackSize;      // 栈的长度 | ||||
|  | ||||
|     public: | ||||
|         LinkedListStack() { | ||||
|             stackTop = nullptr; | ||||
|             stackSize = 0; | ||||
|         } | ||||
|         /* 获取栈的长度 */ | ||||
|         int size() { | ||||
|             return stackSize; | ||||
|         } | ||||
|         /* 判断栈是否为空 */ | ||||
|         bool empty() { | ||||
|             return size() == 0; | ||||
|         } | ||||
|         /* 入栈 */ | ||||
|         void push(int num) { | ||||
|             ListNode* node = new ListNode(num); | ||||
|             node->next = stackTop; | ||||
|             stackTop = node; | ||||
|             stackSize++; | ||||
|         } | ||||
|         /* 出栈 */ | ||||
|         int pop() { | ||||
|             if (size() == 0) | ||||
|                 throw out_of_range("栈为空"); | ||||
|             int num = stackTop->val; | ||||
|             stackTop = stackTop->next; | ||||
|             stackSize--; | ||||
|             return num; | ||||
|         } | ||||
|         /* 访问栈顶元素 */ | ||||
|         int top() { | ||||
|             if (size() == 0) | ||||
|                 throw out_of_range("栈为空"); | ||||
|             return stackTop->val; | ||||
|         } | ||||
|     }; | ||||
|     ``` | ||||
|  | ||||
| === "Python" | ||||
|  | ||||
|     ```python title="linkedlist_stack.py" | ||||
|      | ||||
|     """ 基于链表实现的栈 """ | ||||
|     class LinkedListStack: | ||||
|         def __init__(self): | ||||
|             self.__peek = None | ||||
|             self.__size = 0 | ||||
|  | ||||
|         """ 获取栈的长度 """ | ||||
|         def size(self): | ||||
|             return self.__size | ||||
|  | ||||
|         """ 判断栈是否为空 """ | ||||
|         def is_empty(self): | ||||
|             return not self.__peek | ||||
|  | ||||
|         """ 入栈 """ | ||||
|         def push(self, val): | ||||
|             node = ListNode(val) | ||||
|             node.next = self.__peek | ||||
|             self.__peek = node | ||||
|             self.__size += 1 | ||||
|  | ||||
|         """ 出栈 """ | ||||
|         def pop(self): | ||||
|             # 判空处理 | ||||
|             if not self.__peek: return None | ||||
|             pop = self.__peek.val | ||||
|             self.__peek = self.__peek.next | ||||
|             self.__size -= 1 | ||||
|             return pop | ||||
|  | ||||
|         """ 访问栈顶元素 """ | ||||
|         def peek(self): | ||||
|             # 判空处理 | ||||
|             if not self.__peek: return None | ||||
|             return self.__peek.val | ||||
|     ``` | ||||
|  | ||||
| ### 基于数组的实现 | ||||
| @@ -142,14 +284,14 @@ comments: true | ||||
|     ```java title="array_stack.java" | ||||
|     /* 基于数组实现的栈 */ | ||||
|     class ArrayStack { | ||||
|         List<Integer> list; | ||||
|         private ArrayList<Integer> stack; | ||||
|         public ArrayStack() { | ||||
|             // 初始化列表(动态数组) | ||||
|             list = new ArrayList<>(); | ||||
|             stack = new ArrayList<>(); | ||||
|         } | ||||
|         /* 获取栈的长度 */ | ||||
|         public int size() { | ||||
|             return list.size(); | ||||
|             return stack.size(); | ||||
|         } | ||||
|         /* 判断栈是否为空 */ | ||||
|         public boolean isEmpty() { | ||||
| @@ -157,19 +299,19 @@ comments: true | ||||
|         } | ||||
|         /* 入栈 */ | ||||
|         public void push(int num) { | ||||
|             list.add(num); | ||||
|             stack.add(num); | ||||
|         } | ||||
|         /* 出栈 */ | ||||
|         public int pop() { | ||||
|             return list.remove(size() - 1); | ||||
|             return stack.remove(size() - 1); | ||||
|         } | ||||
|         /* 访问栈顶元素 */ | ||||
|         public int peek() { | ||||
|             return list.get(size() - 1); | ||||
|             return stack.get(size() - 1); | ||||
|         } | ||||
|         /* 访问索引 index 处元素 */ | ||||
|         public int get(int index) { | ||||
|             return list.get(index); | ||||
|             return stack.get(index); | ||||
|         } | ||||
|     } | ||||
|     ``` | ||||
| @@ -177,13 +319,72 @@ comments: true | ||||
| === "C++" | ||||
|  | ||||
|     ```cpp title="array_stack.cpp" | ||||
|      | ||||
|     /* 基于数组实现的栈 */ | ||||
|     class ArrayStack { | ||||
|     private: | ||||
|         vector<int> stack; | ||||
|          | ||||
|     public: | ||||
|         /* 获取栈的长度 */ | ||||
|         int size() { | ||||
|             return stack.size(); | ||||
|         } | ||||
|         /* 判断栈是否为空 */ | ||||
|         bool empty() { | ||||
|             return stack.empty(); | ||||
|         } | ||||
|         /* 入栈 */ | ||||
|         void push(int num) { | ||||
|             stack.push_back(num); | ||||
|         } | ||||
|         /* 出栈 */ | ||||
|         int pop() { | ||||
|             int oldTop = stack.back(); | ||||
|             stack.pop_back(); | ||||
|             return oldTop; | ||||
|         } | ||||
|         /* 访问栈顶元素 */ | ||||
|         int top() { | ||||
|             return stack.back(); | ||||
|         } | ||||
|         /* 访问索引 index 处元素 */ | ||||
|         int get(int index) { | ||||
|             return stack[index]; | ||||
|         } | ||||
|     }; | ||||
|     ``` | ||||
|  | ||||
| === "Python" | ||||
|  | ||||
|     ```python title="array_stack.py" | ||||
|      | ||||
|     """ 基于数组实现的栈 """ | ||||
|     class ArrayStack: | ||||
|         def __init__(self): | ||||
|             self.__stack = [] | ||||
|  | ||||
|         """ 获取栈的长度 """ | ||||
|         def size(self): | ||||
|             return len(self.__stack) | ||||
|  | ||||
|         """ 判断栈是否为空 """ | ||||
|         def is_empty(self): | ||||
|             return self.__stack == [] | ||||
|  | ||||
|         """ 入栈 """ | ||||
|         def push(self, item): | ||||
|             self.__stack.append(item) | ||||
|  | ||||
|         """ 出栈 """ | ||||
|         def pop(self): | ||||
|             return self.__stack.pop() | ||||
|  | ||||
|         """ 访问栈顶元素 """ | ||||
|         def peek(self): | ||||
|             return self.__stack[-1] | ||||
|  | ||||
|         """ 访问索引 index 处元素 """ | ||||
|         def get(self, index): | ||||
|             return self.__stack[index] | ||||
|     ``` | ||||
|  | ||||
| !!! tip | ||||
| @@ -193,5 +394,4 @@ comments: true | ||||
| ## 栈典型应用 | ||||
|  | ||||
| - **浏览器中的后退与前进、软件中的撤销与反撤销。** 每当我们打开新的网页,浏览器就讲上一个网页执行入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么则需要两个栈来配合实现。 | ||||
|  | ||||
| - **程序内存管理。** 每当调用函数时,系统就会在栈顶添加一个栈帧,用来记录函数的上下文信息。在递归函数中,向下递推会不断执行入栈,向上回溯阶段时出栈。 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user