Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Nama: Fairuz Andriansyah
- NIM : 225150307111015
- */
- #include <iostream>
- using namespace std;
- class StackLinkedList
- {
- private:
- struct Node
- {
- string item;
- Node *next;
- };
- Node *head, *tail, *top;
- int n = 0;
- /* buat node baru pas manggil fungsi push */
- Node *create_node (string item)
- {
- Node *newNode = new Node();
- newNode->item = item;
- newNode->next = nullptr;
- n++;
- return newNode;
- }
- /* nambah list di bagian belakang pas manggil fungsi push */
- void add_last (string item)
- {
- Node *tmp = create_node(item);
- if (isEmpty())
- {
- head = tail = tmp;
- }
- else
- {
- tail->next = tmp;
- tail = tmp;
- }
- }
- /* hapus node di bagian belakang pas manggil fungsi pop */
- void remove_last ()
- {
- Node *hapus = tail;
- if (!isEmpty())
- {
- if (head == tail)
- {
- head = tail = nullptr;
- delete hapus;
- }
- else
- {
- Node *p = head;
- while (p->next != tail)
- {
- p = p->next;
- }
- p->next = nullptr;
- tail = p;
- delete hapus;
- }
- n--;
- }
- }
- /*
- cetak semua data dengan urutan terbalik menggunakan rekursif
- yg masuk pertama dicetak terakhir
- */
- void printAll(Node *node)
- {
- if (node == nullptr)
- {
- return;
- }
- printAll(node->next); // rekursif
- if (node == top)
- {
- cout << "|\t" << node->item << "\t| <<---- TOP" << endl
- << "----------------" << endl;
- }
- else
- {
- cout << "|\t" << node->item << "\t|" << endl
- << "----------------" << endl;
- }
- }
- public:
- /* Inisialisasi Node awal */
- void init ()
- {
- head = tail = top = nullptr;
- }
- /* Cek apakah LInkedLIst kosong */
- bool isEmpty ()
- {
- return top == nullptr;
- }
- /* Fungsi mengembalikan jumlah data dalam LinkedList */
- int size ()
- {
- return n;
- }
- /* Fungsi push, add last data */
- void push (string item)
- {
- add_last (item);
- top = tail;
- }
- /*
- Fungsi mengambil data paling atas,
- lalu menghapus data yang telah diambil tersebut dari LinkedList
- */
- string pop ()
- {
- string tempData = top->item;
- remove_last();
- top = tail;
- return tempData;
- }
- /* Fungsi mencari data berdasarkan index */
- void searchIndex (int index)
- {
- if (index < 0 || index >= n)
- {
- cout << "Index " << index << " tidak valid. Input antara 0 - " << n-1 << endl;
- }
- else
- {
- Node *p = head;
- for (int i = 0; i < index; i++)
- {
- p = p->next;
- }
- cout << "Data pada index ke-" << index << " adalah: " << p->item << endl;
- }
- }
- /* Fungsi mencari data berdasarkan item */
- void searchItem(string item)
- {
- Node *temp = head;
- int i = 0;
- while (temp != nullptr)
- {
- if (temp->item == item)
- {
- cout << "Data '" << item << "' ditemukan pada index ke-" << i << endl;
- return;
- }
- temp = temp->next;
- i++;
- }
- cout << "Data '" << item << "' tidak ditemukan." << endl;
- }
- /* cetak semua data dalam list */
- void printAll()
- {
- if (isEmpty())
- {
- cout << "Stack kosong." << endl;
- return;
- }
- cout << "Jumlah data dalam Stack: " << size() << endl
- << "Data dalam Stack:" << endl;
- printAll(head); // panggil fungsi rekursif
- }
- /*menghapus semua node biar ga memory leak*/
- void deleteAll ()
- {
- while (head != nullptr)
- {
- remove_last();
- }
- top = tail;
- }
- };
- int main ()
- {
- StackLinkedList list;
- list.init();
- int size, idx;
- char choice;
- string item;
- menu:
- system("cls");
- cout << "Nama: Fairuz Andriansyah"
- << "NIM : 225150307111015\n\n";
- cout << "Program Stack menggunakan Linked List\n"
- << "=====================================\n";
- cout << "Menu:\n"
- << "1. Push Data\n" //done
- << "2. Pop Data\n" //done
- << "3. Search by Index\n" //done
- << "4. Search by Item\n" // done
- << "5. Print All Data\n" // done
- << "0. Exit\n" // done
- << "Pilihan Anda (1/2/.../0): ";
- cin >> choice;
- cout << endl;
- switch (choice)
- {
- case '1': // Push Data
- cout << "Masukkan jumlah data yang ingin dimasukkan: ";
- cin >> size; // input jumlah item yang ingin dimasukkan
- for (int i = 0; i < size; i++) // perulangan input item sesuai jumlah yang diinginkan
- {
- cout << "Masukkan data ke-" << i+1 << ": ";
- getline(cin >> ws, item); // input item (string)
- list.push(item);
- }
- cout << "Data berhasil dimasukkan!\n" << endl;
- cout << "Tekan Enter untuk kembali ke menu...";
- cin.get();
- goto menu;
- break;
- case '2': // Pop Data
- if (!list.isEmpty())
- {
- cout << "data '" << list.pop() << "' berhasil di-pop." << endl;
- }
- else
- {
- cout << "Stack kosong." << endl;
- }
- cout << "\nTekan Enter untuk kembali ke menu...";
- cin.ignore();
- cin.get();
- goto menu;
- break;
- case '3': // Search by Index
- if (list.isEmpty())
- {
- cout << "Stack kosong." << endl;
- }
- else
- {
- cout << "Masukkan index yang ingin dicari: "; // input index (mulai dari 0)
- cin >> idx;
- list.searchIndex(idx);
- }
- cout << "\nTekan Enter untuk kembali ke menu...";
- cin.ignore();
- cin.get();
- goto menu;
- break;
- case '4': // Search by Item
- if (list.isEmpty())
- {
- cout << "Stack kosong." << endl;
- }
- else
- {
- cout << "Masukkan data yang ingin dicari: "; // input item yang ingin dicari (string)
- getline(cin >> ws, item);
- list.searchItem(item);
- }
- cout << "\nTekan Enter untuk kembali ke menu...";
- cin.get();
- goto menu;
- break;
- case '5': // Print All Data
- list.printAll();
- cout << "\nTekan Enter untuk kembali ke menu...";
- cin.ignore();
- cin.get();
- goto menu;
- break;
- case '0': // Exit
- cout << "tks." << endl;
- break;
- default: // Invalid Input
- cout << "Pilihan tidak valid." << endl;
- cout << "Tekan Enter untuk kembali ke menu...";
- cin.ignore();
- cin.get();
- goto menu;
- break;
- }
- list.deleteAll(); // hapus semua node biar ga memory leak
- list.printAll(); // cek udh kehapus apa blm. udh sih :P
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement