停更說明:國慶陪女朋友旅遊去了,並且發生了許多許多有趣的事情,有空再分享哈
這裏該來一條華麗麗的分割線
現在來說說數據結構中的棧,英文中好像是Stack,翻譯過來棧其實是很形象的(棧的出口和入口相同,且只有一個進出口),我們平時通過變量聲明(非NEW方法)申請來的存儲變量的方法其實就是棧內存。
特點:
- 入棧元素先進先出
- 屬於操作受限的線性表
- 僅有一個棧頂指針
- babal…
下面是順序棧的實現
存儲:一個指定大小的數組,感覺向量也是可以(視應用環境)
棧頂指針依據:數組下標
操作:出棧、入棧、查看棧頂元素
類內部有用的函數:棧的判空判滿
模板:
#pragma once
#include<iostream>
using namespace std;
const int MaxSize = 100;
template<typename T>
class Stack {
public:
Stack();
~Stack();
bool Empty(); //判空
bool Full(); //判滿
bool EnStack(T x); //入棧
bool pop(); //出棧
bool GetTop(T &element); //獲取棧頂元素
private:
T data[MaxSize];
int top;
};
template<typename T>
Stack<T>::Stack() { //構造函數
top = -1;
}
template<typename T>
Stack<T>::~Stack() { //析構函數
}
template<typename T>
bool Stack<T>::Empty() { //判空
return top == -1 ? true : false;
}
template<typename T>
bool Stack<T>::Full() { //判滿
return top == MaxSize - 1 ? true : false;
}
template<typename T>
bool Stack<T>::EnStack(T x) { //進棧
if (Full()) {
return false;
}
top++;
data[top] = x;
return true;
}
template<typename T>
bool Stack<T>::pop() { //出棧
if (Empty()) {
return false;
}
top--;
return true;
}
template<typename T>
bool Stack<T>::GetTop(T &element) { //查看棧頂元素
if (!Empty()) {
element = data[top];
return true;
}
return false;
}
小例子測試
#include<iostream>
#include"Stack.h"
using namespace std;
int main() {
Stack<int> *p = new Stack<int>; //申請一個棧
p->EnStack(1); //判空
int element;
if (p->GetTop(element)) { //查看棧頂元素
cout << element << endl;
}
p->EnStack(2); //進棧
if (p->GetTop(element)) {
cout << element << endl;
}
p->pop(); //出棧
if (p->GetTop(element)) {
cout << element << endl;
}
cout << p->Full()<<endl;
cout<<p->Empty();
return 0;
}
結果:
缺點:缺少了代碼的健壯性(其實可以裝逼的說魯棒性233)
總結:很像一個減肥版的順序表(減少了很多方法),在實際應用的時候應該注意合不合適,數組的MaxSize應該取什麼值