Stack & Queue
Stack
LIFO (Last In First Out)
0 1 2
[4, 7, 8]
| 8 | 2
| 7 | 1
|_4_| 0
Declare
- Python
- Java
- C++
s = []
import java.util.Stack;
Stack<Integer> variable = new Stack<Integer>();
#include <stack>
using namespace std;
stack<int> s;
Add elements
- Python
- Java
- C++
s = []
s.push(1)
Stack<Integer> s = new Stack<Integer>();
s.push(1);
stack<int> s;
s.push(1);
Delete last (most above) element
- Python
- Java
- C++
value = s.pop();
int value = s.pop();
s.pop(); // note that this doesn't return popped value
Get value of last (most above) element
- Python
- Java
- C++
value = s[-1]
int value = s.peek();
int value = s.top();
Get stack's size
- Python
- Java
- C++
n = len(s)
int n = s.size();
int n = s.size();
Check if stack is empty
- Python
- Java
- C++
if len(s) == 0:
# statement
if( s.empty() )
// statement
if( s.empt() == true)
// statement
Swap 2 stacks
- Python
- Java
- C++
s1, s2 = s2, s1
Stack<Integer> temp = s1;
s1 = s2;
s2 = temp;
s1.swap(s2);
Queue
FIFO (First In First Out)
_________
=> 4 3 2 1 =>
---------
Một lợi thế queue so với stack là về mặt bộ nhớ. Queue có thể implement bằng linked list nên nằm rời rạc ở các vùng nhớ được tận dụng được vùng nhớ phân mảnh.
Declare
- Python
- Java
- C++
# There are many types like LIFO Queue, Queue, Priority Queue. So we need to
# import correct one.
# Python 2
import Queue
q = Queue.Queue()
# Python 3
import queue
q = queue.Queue()
# My favorite, only import what you need
from queue import Queue
q = Queue()
// Queue in Java is just interface (no memory located) -> so we implement it using LinkedList
import java.util.LinkedList;
import java.util.Queue;
Queue<Integer> q = new LinkedList<Integer>();
#include <queue>
using namespace std;
queue<int> q;
EnQueue (add element)
- Python
- Java
- C++
q.put(1)
q.add(1);
q.offer(2);
q.push(1);
Deque (delete element)
Delete here means remove the first element. Since queue is FIFO, we can only
delete the first element. So we don't have pop()
method like stack (get the
last element).
- Python
- Java
- C++
value = q.get()
int value = q.remove();
q.pop(); // doesn't return value
Get value of the first element
- Python
- Java
- C++
# Trick with Python, since queue is implemented using list.
value = q.queue[0]
int value = q.peek();
int value = q.front();
Get queue's size
- Python
- Java
- C++
n = q.qsize()
int n = q.size();
int n = q.size();
Check if queue is empty
- Python
- Java
- C++
if q.empty():
# statement
if( q.isEmpty() )
// statement
if( q.empty() == true )
// statement
Swap 2 queues
- Python
- Java
- C++
q1, q2 = q2, q1
Queue<Integer> temp = q1;
q1 = q2;
q2 = temp;
q1.swap(q2);
Deque (double ended queue)
Deque thì thay vì như queue là thêm cuối lấy đầu thì dequeue có thể thêm lấy ở cả 2 đầu. Có thể nói là sự kết hợp giữa stack và queue.
- Python
- Java
- C++
Compare complexity
Ứng dụng của stack và queue
Lưu trữ và cơ chế hoạt động. Cơ chế hoạt động của đệ quy là stack (gọi dần xuống dư ới, tới dưới cùng làm xong thì quay ngược lại)
Khử đệ quy thì dùng stack để lưu trữ function, info (vì dùng đệ quy phải tốn chi phí tạo lại function).