Cài đặt Stack bằng danh sách liên kết đơn trong C++


| Cài đặt Stack bằng danh sách liên kết đơn trong C++



Khai báo struct NODE và LIST


typedef struct node
{
      int data;
      node* next;
}NODE;

typedef struct list
{
      NODE* head;
      NODE* tail;
}LIST;

Prototype

void init(LIST&);
int IsEmpty(LIST);
NODE* creatNode(int);
void Push(LIST&, NODE*);
int Pop(LIST&, int&);
int Peek(LIST&);
void Nhap(LIST&);
void Xuat(LIST);
void Menu();
void XulyMenu(LIST&);

Khởi tạo danh sách liên kết

void init(LIST& s)
{
      s.head = s.tail = NULL;
}

Tạo node mới trong danh sách liên kết đơn

NODE* creatNode(int x)
{
      NODE* p = new NODE;
      if (p == NULL)
            return NULL;
      p->data = x;
      p->next = NULL;
      return p;
}

Kiểm tra Stack có rỗng không

int IsEmpty(LIST s)
{
      return (s.head == NULL);
}
Lưu ý: cài Stack từ Danh sách liên kết đơn không cần Hàm kiểm tra Stack có đầy không (IsFull)

Push: Thêm đối tượng vào Stack

void Push(LIST& s, NODE* p)
{
      if (IsEmpty(s))
      {
            s.head = s.tail = p;
      }
      else
      {
            p->next = s.head;
            s.head = p;
      }
}

Pop: Xoá và lấy đối tượng từ Stack

int Pop(LIST& s, int& trave)
{
      NODE* p;
      if (!IsEmpty(s))
      {
            if (s.head != NULL)
            {
                  p = s.head;
                  trave = p->data;
                  s.head = s.head->next;
                  if (s.head == NULL)
                        s.tail = NULL;
                  return 1;
                  delete p;
            }
      }
      return 0;
}

Peek: Lấy đối tượng từ Stack nhưng không xoá

int Peek(LIST& s)
{
      return s.head->data;
}


Hàm nhập

void Nhap(LIST& s)
{
      int n;
      cout << "Nhap so phan tu cua Stack: ";
      cin >> n;
      for (int i = 0; i < n; i++)
      {
            int x;
            cout << "Nhap phan tu thu " << i << ": ";
            cin >> x;
            NODE* p = creatNode(x);
            Push(s, p);
      }
}

Hàm xuất

void Xuat(LIST s)
{
      if (IsEmpty(s))
            cout << "Stack rong.\n";
      else
      {
            cout << "Xuat Stack: ";
            for (NODE* p = s.head; p != NULL; p = p->next)
            {
                  cout << p->data << " ";
            }
            cout << endl;
      }
}

Xuất danh sách Menu

void Menu()
{
      cout << "\n1. Kiem tra Stack rong hay khong?";
      cout << "\n2. Push phan tu vao Stack.";
      cout << "\n3. Pop phan tu tu Stack.";
      cout << "\n4. Xem phan tu o dau Stack.";
      cout << "\n5. Xuat Stack.";
      cout << "\n6. Thoat.";
cout << endl;
}

Xử lý Menu với lựa chọn tương ứng

void XulyMenu(LIST& s)
{
      int luachon;
      do
      {
            cout << "\nNhap lua chon: ";
            cin >> luachon;
            switch (luachon)
            {
            case 1:
            {
                  if (IsEmpty(s))
                        cout << "Stack rong.\n";
                  else cout << "Stack khong rong.\n";
                  break;
            }
            case 2:
            {
                  int x;
                  cout << "Nhap gia tri phan tu can push: ";
                  cin >> x;
                  NODE* p = creatNode(x);
                  Push(s, p);
                  cout << "Push thanh cong.\n";
                  Xuat(s);
                  break;
            }
            case 3:
            {
                  int trave;
                  Pop(s, trave);
                  cout << "Phan tu da pop: " << trave << endl;
                  Xuat(s);
                  break;
            }
            case 4:
            {
                  cout << "Phan tu o dau Stack: " << Peek(s) << endl;
                  break;
            }
            case 5:
            {
                  Xuat(s);
                  break;
            }
            case 6:
                  exit(1);
                  break;
            }
      } while (luachon < 1 || luachon > 6);
}

Main.cpp

#include <iostream>
using namespace std;
int main()
{
      LIST s;
      init(s);
      Nhap(s);
      Xuat(s);
      Menu();
      while (true)
      {
            XulyMenu(s);
      }
      system("pause");
      return 0;
}

Nhận xét