停更说明:国庆陪女朋友旅游去了,并且发生了许多许多有趣的事情,有空再分享哈
这里该来一条华丽丽的分割线
现在来说说数据结构中的栈,英文中好像是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应该取什么值