Pertemuan 05
Universitas Pertahanan RI
Setelah pertemuan ini, mahasiswa mampu:
Stack adalah struktur data linear yang mengikuti prinsip LIFO (Last-In-First-Out) â elemen yang terakhir dimasukkan akan menjadi elemen pertama yang dikeluarkan.
đŊī¸ Bayangkan setumpuk piring di dapur â piring terakhir yang diletakkan di atas akan menjadi piring pertama yang diambil.
TOP â
Last In = First Out
Placeholder: images/p05-01-ilustrasi-konsep-lifo.png
| Analogi | Penjelasan |
|---|---|
| đŊī¸ Tumpukan piring | Piring teratas diambil pertama |
| đ Tumpukan buku | Buku di atas diambil lebih dulu |
| âŠī¸ Undo di editor | Aksi terakhir di-undo pertama |
| đ Browser back | Halaman terakhir dikunjungi kembali |
| đ Call stack | Fungsi terakhir selesai pertama |
Dalam operasi militer, konsep stack sangat relevan:
ADT Stack mendefinisikan stack sebagai kumpulan elemen dengan operasi yang terbatas pada satu ujung yang disebut TOP.
| Operasi | Deskripsi | Return |
|---|---|---|
push(x) |
Menambahkan x ke top | void |
pop() |
Menghapus & mengembalikan top | elemen |
peek() |
Mengembalikan top tanpa hapus | elemen |
isEmpty() |
Cek apakah kosong | boolean |
isFull() |
Cek apakah penuh (array) | boolean |
â Tambah di TOP
â Hapus dari TOP, return 40
Placeholder: images/p05-02-push-pop-operations.png
Stack kosong S. Apa hasil setelah operasi berikut?
push(5), push(10), push(15), pop(), push(20), pop(), pop()
Jawaban:
Stack akhir: [5]
Return values: 15, 20, 10
| Step | Operasi | Stack | Return |
|---|---|---|---|
| 1 | push(5) | [5] | - |
| 2 | push(10) | [5, 10] | - |
| 3 | push(15) | [5, 10, 15] | - |
| 4 | pop() | [5, 10] | 15 |
| 5 | push(20) | [5, 10, 20] | - |
| 6 | pop() | [5, 10] | 20 |
| 7 | pop() | [5] | 10 |
Menggunakan array dengan ukuran tetap (fixed size)
topIndex = -1 menandakan stack kosong++topIndex, lalu simpan data--topIndexPlaceholder: images/p05-03-array-memory-layout.png
class StackArray {
private:
static const int MAX_SIZE = 100;
int data[MAX_SIZE];
int topIndex; // -1 jika kosong
public:
StackArray() : topIndex(-1) {}
bool isEmpty() { return topIndex == -1; }
bool isFull() { return topIndex == MAX_SIZE - 1; }
};
void push(int value) {
if (isFull()) {
cout << "Error: Stack Overflow!" << endl;
return;
}
data[++topIndex] = value;
}
â ī¸ Stack Overflow: Terjadi ketika push ke stack yang sudah penuh
int pop() {
if (isEmpty()) {
cout << "Error: Stack Underflow!" << endl;
return -1;
}
return data[topIndex--];
}
int peek() {
if (isEmpty()) {
cout << "Error: Stack kosong!" << endl;
return -1;
}
return data[topIndex];
}
| Operasi | Time | Space |
|---|---|---|
| push() | O(1) | O(1) |
| pop() | O(1) | O(1) |
| peek() | O(1) | O(1) |
| isEmpty() | O(1) | O(1) |
Total Space: O(n) untuk n elemen maksimum
Doubling Strategy: Kapasitas dilipatgandakan saat penuh
void resize() {
int newCapacity = capacity * 2;
int* newData = new int[newCapacity];
for (int i = 0; i <= topIndex; i++)
newData[i] = data[i];
delete[] data;
data = newData;
capacity = newCapacity;
}
Amortized push: O(1)
Operasi push dan pop dilakukan di head (bukan tail) untuk kompleksitas O(1)
Placeholder: images/p05-04-linked-list-stack.png
struct Node {
int data;
Node* next;
Node(int value) : data(value), next(nullptr) {}
};
Visualisasi: topNode â [40] â [30] â [20] â [10] â NULL
void push(int value) {
Node* newNode = new Node(value);
newNode->next = topNode; // Arahkan ke top lama
topNode = newNode; // Update top
count++;
}
â Kompleksitas: O(1) - selalu di head
int pop() {
if (isEmpty()) {
cout << "Stack Underflow!" << endl;
return -1;
}
Node* temp = topNode;
int value = temp->data;
topNode = topNode->next; // Update top
delete temp; // Hapus node lama
count--;
return value;
}
Mengapa operasi stack di linked list dilakukan di HEAD, bukan TAIL?
Jawaban:
Pop di TAIL membutuhkan O(n) karena harus traverse untuk menemukan node sebelum tail.
Pop di HEAD: O(1) - akses langsung!
Placeholder: images/p05-09-pop-tail-on-complexity.png
| Aspek | Array Static | Array Dynamic | Linked List |
|---|---|---|---|
| Ukuran | Tetap | Fleksibel | Fleksibel |
| Push | O(1) | O(1)* | O(1) |
| Pop | O(1) | O(1) | O(1) |
| Cache | Friendly | Friendly | Tidak |
| Overflow | Mungkin | Tidak | Tidak |
* amortized
Memeriksa apakah tanda kurung () [] {} dalam string sudah seimbang.
â Balanced: "([]){}", "{[()]}"
â Not Balanced: "([)]", "((("
bool isBalanced(string expr) {
stack<char> s;
for (char c : expr) {
if (c == '(' || c == '[' || c == '{')
s.push(c);
else if (c == ')' || c == ']' || c == '}') {
if (s.empty()) return false;
char top = s.top();
s.pop();
if (!isMatchingPair(top, c))
return false;
}
}
return s.empty();
}
| Step | Char | Action | Stack |
|---|---|---|---|
| 1 | { | PUSH | { |
| 2 | [ | PUSH | {[ |
| 3 | ( | PUSH | {[( |
| 4 | ) | POP â | {[ |
| 5 | ] | POP â | { |
| 6 | } | POP â | empty |
Hasil: BALANCED â
Placeholder: images/p05-05-balanced-parentheses-trace.png
Trace algoritma untuk string: "[(])"
| Char | Action | Stack |
|---|---|---|
| [ | PUSH | [ |
| ( | PUSH | [( |
| ] | POP ( | [ |
( tidak match dengan ] â NOT BALANCED â
| Notasi | Format | Contoh |
|---|---|---|
| Infix | operand op operand | A + B |
| Prefix | op operand operand | + A B |
| Postfix | operand operand op | A B + |
| Operator | Prioritas | Associativity |
|---|---|---|
^ |
3 (tertinggi) | Right to Left |
* / |
2 | Left to Right |
+ - |
1 (terendah) | Left to Right |
Shunting-Yard Algorithm:
( â push ke stack) â pop sampai (| Token | Action | Stack | Output |
|---|---|---|---|
| ( | PUSH | ( | |
| A | Output | ( | A |
| + | PUSH | (+ | A |
| B | Output | (+ | AB |
| ) | POP sampai ( | AB+ | |
| * | PUSH | * | AB+ |
| C | Output | * | AB+C |
| END | POP all | AB+C* |
Placeholder: images/p05-06-infix-to-postfix.png
Algoritma:
int evaluatePostfix(string postfix) {
stack<int> operandStack;
for (char token : postfix) {
if (isdigit(token))
operandStack.push(token - '0');
else {
int op2 = operandStack.top(); operandStack.pop();
int op1 = operandStack.top(); operandStack.pop();
int result;
switch (token) {
case '+': result = op1 + op2; break;
case '-': result = op1 - op2; break;
case '*': result = op1 * op2; break;
case '/': result = op1 / op2; break;
}
operandStack.push(result);
}
}
return operandStack.top();
}
| Token | Action | Stack | Calc |
|---|---|---|---|
| 2 | PUSH | [2] | - |
| 3 | PUSH | [2, 3] | - |
| * | POP, calc, PUSH | [6] | 2*3=6 |
| 5 | PUSH | [6, 5] | - |
| + | POP, calc, PUSH | [11] | 6+5=11 |
Hasil: 11
Placeholder: images/p05-07-postfix-evaluation-trace.png
Hitung nilai ekspresi postfix: "53+2*4-"
5+3 = 8 â 8*2 = 16 â 16-4 = 12
Infix: (5+3)*2-4 = 12 â
Setiap fungsi dipanggil â stack frame di-push
Fungsi selesai â stack frame di-pop
int factorial(int n) {
if (n <= 1) return 1; // Base case
return n * factorial(n-1); // Recursive
}
Placeholder: images/p05-08-function-call-stack.png
Placeholder: images/p05-10-factorial-call-stack-trace.png
| Konsep | Poin Penting |
|---|---|
| LIFO | Last-In-First-Out |
| Operasi | push(), pop(), peek(), isEmpty() |
| Array | O(1) semua operasi, ukuran tetap/dinamis |
| Linked List | O(1) semua operasi, ukuran fleksibel |
| Balanced () | Push buka, pop & match tutup |
| Postfix | Push operand, pop-calc-push operator |
Silakan bertanya atau diskusi
Referensi: Cormen Ch.10.1 | Weiss Ch.3.6 | Hubbard Ch.5
Struktur Data dan Algoritma
Pertemuan 05: Stack
Š 2026 - CC BY 4.0