Advertisement
remshixi

Soal4_Stack_LinkedList

May 21st, 2024
699
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.75 KB | None | 0 0
  1. /*
  2. Nama: Fairuz Andriansyah
  3. NIM : 225150307111015
  4. */
  5.  
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. class StackLinkedList
  10. {
  11. private:
  12.     struct Node
  13.     {
  14.         string item;
  15.         Node *next;
  16.     };
  17.  
  18.     Node *head, *tail, *top;
  19.     int n = 0;
  20.  
  21.     /* buat node baru pas manggil fungsi push */
  22.     Node *create_node (string item)
  23.     {
  24.         Node *newNode = new Node();
  25.         newNode->item = item;
  26.         newNode->next = nullptr;
  27.         n++;
  28.         return newNode;
  29.     }
  30.  
  31.     /* nambah list di bagian belakang pas manggil fungsi push */
  32.     void add_last (string item)
  33.     {
  34.         Node *tmp = create_node(item);
  35.         if (isEmpty())
  36.         {
  37.             head = tail = tmp;
  38.         }
  39.         else
  40.         {
  41.             tail->next = tmp;
  42.             tail = tmp;
  43.         }
  44.     }
  45.  
  46.     /* hapus node di bagian belakang pas manggil fungsi pop */
  47.     void remove_last ()
  48.     {
  49.         Node *hapus = tail;
  50.         if (!isEmpty())
  51.         {
  52.             if (head == tail)
  53.             {
  54.                 head = tail = nullptr;
  55.                 delete hapus;
  56.             }
  57.             else
  58.             {
  59.                 Node *p = head;
  60.                 while (p->next != tail)
  61.                 {
  62.                     p = p->next;
  63.                 }
  64.                 p->next = nullptr;
  65.                 tail = p;
  66.                 delete hapus;
  67.             }
  68.             n--;
  69.         }
  70.     }
  71.  
  72.     /*
  73.     cetak semua data dengan urutan terbalik menggunakan rekursif
  74.     yg masuk pertama dicetak terakhir
  75.     */
  76.     void printAll(Node *node)
  77.     {
  78.         if (node == nullptr)
  79.         {
  80.             return;
  81.         }
  82.  
  83.         printAll(node->next); // rekursif
  84.         if (node == top)
  85.         {
  86.         cout << "|\t" << node->item << "\t|  <<---- TOP" << endl
  87.                 << "----------------" << endl;
  88.         }
  89.         else
  90.         {
  91.         cout << "|\t" << node->item << "\t|" << endl
  92.                 << "----------------" << endl;
  93.         }
  94.     }
  95.  
  96. public:
  97.  
  98.     /* Inisialisasi Node awal */
  99.     void init ()
  100.     {
  101.         head = tail = top = nullptr;
  102.     }
  103.  
  104.     /* Cek apakah LInkedLIst kosong */
  105.     bool isEmpty ()
  106.     {
  107.         return top == nullptr;
  108.     }
  109.  
  110.     /* Fungsi mengembalikan jumlah data dalam LinkedList */
  111.     int size ()
  112.     {
  113.         return n;
  114.     }
  115.  
  116.     /* Fungsi push, add last data */
  117.     void push (string item)
  118.     {
  119.         add_last (item);
  120.         top = tail;
  121.     }
  122.  
  123.     /*
  124.     Fungsi mengambil data paling atas,
  125.     lalu menghapus data yang telah diambil tersebut dari LinkedList
  126.     */
  127.     string pop ()
  128.     {
  129.         string tempData = top->item;
  130.         remove_last();
  131.         top = tail;
  132.         return tempData;
  133.     }
  134.  
  135.     /* Fungsi mencari data berdasarkan index */
  136.     void searchIndex (int index)
  137.     {
  138.         if (index < 0 || index >= n)
  139.         {
  140.             cout << "Index " << index << " tidak valid. Input antara 0 - " << n-1 << endl;
  141.         }
  142.         else
  143.         {
  144.             Node *p = head;
  145.             for (int i = 0; i < index; i++)
  146.             {
  147.                 p = p->next;
  148.             }
  149.             cout << "Data pada index ke-" << index << " adalah: " << p->item << endl;
  150.         }
  151.     }
  152.  
  153.     /* Fungsi mencari data berdasarkan item */
  154.     void searchItem(string item)
  155.     {
  156.         Node *temp = head;
  157.         int i = 0;
  158.         while (temp != nullptr)
  159.         {
  160.             if (temp->item == item)
  161.             {
  162.                 cout << "Data '" << item << "' ditemukan pada index ke-" << i  << endl;
  163.                 return;
  164.             }
  165.             temp = temp->next;
  166.             i++;
  167.         }
  168.         cout << "Data '" << item << "' tidak ditemukan." << endl;
  169.     }
  170.  
  171.     /* cetak semua data dalam list */
  172.     void printAll()
  173.     {
  174.         if (isEmpty())
  175.         {
  176.             cout << "Stack kosong." << endl;
  177.             return;
  178.         }
  179.         cout << "Jumlah data dalam Stack: " << size() << endl
  180.                 << "Data dalam Stack:" << endl;
  181.         printAll(head); // panggil fungsi rekursif
  182.     }
  183.  
  184.  
  185.     /*menghapus semua node biar ga memory leak*/
  186.     void deleteAll ()
  187.     {
  188.         while (head != nullptr)
  189.         {
  190.             remove_last();
  191.         }
  192.         top = tail;
  193.     }
  194.    
  195. };
  196.  
  197. int main ()
  198. {
  199.     StackLinkedList list;
  200.     list.init();
  201.     int size, idx;
  202.     char choice;
  203.     string item;
  204.  
  205.     menu:
  206.     system("cls");
  207.     cout << "Nama: Fairuz Andriansyah"
  208.             << "NIM : 225150307111015\n\n";
  209.     cout << "Program Stack menggunakan Linked List\n"
  210.             << "=====================================\n";
  211.     cout << "Menu:\n"
  212.             << "1. Push Data\n" //done
  213.             << "2. Pop Data\n" //done
  214.             << "3. Search by Index\n" //done
  215.             << "4. Search by Item\n" // done
  216.             << "5. Print All Data\n" // done
  217.             << "0. Exit\n" // done
  218.             << "Pilihan Anda (1/2/.../0): ";
  219.     cin >> choice;
  220.     cout << endl;
  221.  
  222.     switch (choice)
  223.     {
  224.         case '1': // Push Data
  225.             cout << "Masukkan jumlah data yang ingin dimasukkan: ";
  226.             cin >> size; // input jumlah item yang ingin dimasukkan
  227.             for (int i = 0; i < size; i++) // perulangan input item sesuai jumlah yang diinginkan
  228.             {
  229.                 cout << "Masukkan data ke-" << i+1 << ": ";
  230.                 getline(cin >> ws, item); // input item (string)
  231.                 list.push(item);
  232.             }
  233.             cout << "Data berhasil dimasukkan!\n" << endl;
  234.             cout << "Tekan Enter untuk kembali ke menu...";
  235.             cin.get();
  236.             goto menu;
  237.             break;
  238.         case '2': // Pop Data
  239.             if (!list.isEmpty())
  240.             {
  241.                 cout << "data '" << list.pop() << "' berhasil di-pop." << endl;
  242.             }
  243.             else
  244.             {
  245.                 cout << "Stack kosong." << endl;
  246.             }
  247.             cout << "\nTekan Enter untuk kembali ke menu...";
  248.             cin.ignore();
  249.             cin.get();
  250.             goto menu;
  251.             break;
  252.         case '3': // Search by Index
  253.             if (list.isEmpty())
  254.             {
  255.                 cout << "Stack kosong." << endl;
  256.             }
  257.             else
  258.             {
  259.                 cout << "Masukkan index yang ingin dicari: "; // input index (mulai dari 0)
  260.                 cin >> idx;
  261.                 list.searchIndex(idx);
  262.             }
  263.             cout << "\nTekan Enter untuk kembali ke menu...";
  264.             cin.ignore();
  265.             cin.get();
  266.             goto menu;
  267.             break;
  268.         case '4': // Search by Item
  269.             if (list.isEmpty())
  270.             {
  271.                 cout << "Stack kosong." << endl;
  272.             }
  273.             else
  274.             {
  275.                 cout << "Masukkan data yang ingin dicari: "; // input item yang ingin dicari (string)
  276.                 getline(cin >> ws, item);
  277.                 list.searchItem(item);
  278.             }
  279.             cout << "\nTekan Enter untuk kembali ke menu...";
  280.             cin.get();
  281.             goto menu;
  282.             break;
  283.         case '5': // Print All Data
  284.             list.printAll();
  285.             cout << "\nTekan Enter untuk kembali ke menu...";
  286.             cin.ignore();
  287.             cin.get();
  288.             goto menu;
  289.             break;
  290.         case '0': // Exit
  291.             cout << "tks." << endl;
  292.             break;
  293.         default: // Invalid Input
  294.             cout << "Pilihan tidak valid." << endl;
  295.             cout << "Tekan Enter untuk kembali ke menu...";
  296.             cin.ignore();
  297.             cin.get();
  298.             goto menu;
  299.             break;
  300.     }
  301.    
  302.     list.deleteAll(); // hapus semua node biar ga memory leak
  303.     list.printAll(); // cek udh kehapus apa blm. udh sih :P
  304.  
  305.     return 0;
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement