堆疊(Stack):是指一個具有後進先出(Last-In First-Out, LIFO)特性的有序串列。
也就是說,加入和刪除元素發生在頂端(top),加入的動作稱為 push,刪除的動作稱為 pop。
堆疊類別可以提供給使用者以下幾種的動作:
這邊就是堆疊的第一個大重點啦,主要會集中在 push 和 pop 的實作上,主要有兩種實作方式
這兩個資料結構很基本,基本上所有進階的資料結構都是由 Array 和 Linked List 實作出來的。
這邊放上參考的連結,大家可以先去看看這兩個資料結構喔。
另外:top也是一個指標(pointer),預設值為 NULL(空值),top 指向的節點就是頂端元素。
細講了每個操作的流程,也畫了流程圖,該把她轉換成程式碼了,用 C++ 來實作堆疊類別:
#include <iostream>
#include <limits.h>
#define SIZE 256
using namespace std;
class Stack{
private:
int* arr;
int top;
public:
Stack();
bool isEmpty();
bool isFull();
void push(int item);
int pop();
};
Stack::Stack(){
this->arr = new int[SIZE];
this->top = -1;
}
bool Stack::isEmpty(){
if(this->top <= -1) return true;
else return false;
}
bool Stack::isFull(){
if(this->top >= SIZE - 1) return true;
else return false;
}
void Stack::push(int item){
if(isFull()){
cout << "push fail" << endl;
}else{
this->top++;
arr[top] = item;
}
}
int Stack::pop(){
if(isEmpty()){
cout << "pop fail" << endl;
return INT_MIN;
}else{
int x = arr[this->top];
this->top--;
return x;
}
}
#include <iostream>
#include <limits.h>
using namespace std;
typedef struct node{
int data;
struct node* link;
}node_t;
class Stack{
private:
node_t* top;
public:
Stack();
bool isEmpty();
void push(int item);
int pop();
};
Stack::Stack(){
this->top = nullptr;
}
bool Stack::isEmpty(){
if(this->top == nullptr) return true;
else return false;
}
void Stack::push(int item){
node_t* newNode = new node_t;
newNode->data = item;
newNode->link = this->top;
this->top = newNode;
}
int Stack::pop(){
if(isEmpty()){
cout << "pop fail" << endl;
return INT_MIN;
}else{
node_t* p = this->top;
int x = p->data;
this->top = p->link;
delete p;
return x;
}
}