这个星期学到了栈。
老师一开始就给我们明确一个概念,我们有堆,有栈,但是没有堆栈!!!
O(∩_∩)O我们先明确一下stack的概念吧。
栈(stack)是限定仅在一端进行插入或删除操作的线性表。成为“LIFO”线性表,意思是“后进先出”,(last in first out)
术语:
top(栈顶元素)--可访问元素
push(入栈)---元素插入
pop(出栈)--元素删除
----(参考shaffer数据结构与算法分析教材)
我们可以分析得出,其实stack就是一种特殊化的线性表,它只能在一端进行插入或删除。
顺序表有两个设定top的方法
1、
1 2 3 4 5 top在1可以实现嘛?
可以!
分析:
插入:复杂度为O(n)
删除:复杂度为O(1)
2、
1 2 3 4 5 top在5可以实现吗?
可以!
分析:
插入:复杂度为O(1)
删除:复杂度为O(1)
我想,谁更优已经很明显了。
top的设定也有两个方法:
1、指向第一个可以利用的位置
2、指向最后一个存放的数据的位置
这两个实现起来有点差别,自己注意下就好了
贴上我的简单实现代码:
头文件stack.h:
include<iostream>
using namespace std;
template<typename E>
class stack
{
private:
E *arr;
int size;
int top=0;
public:
stack(int s)
{
size=s;
arr=new E[s];
top=0;
}
~stack()
{
delete arr;
}
bool push(E it)
{
if(top==size)
{
cout<<"满了"<<endl;
return false;
}
else
{
arr[top]=it;
top++;
return true;
}
}
bool pop()
{
if(top==0)
{
cout<<"empty"<<endl;
return false;
}
else
{
cout<<"删除了:"<<arr[top-1]<<endl;
top--;
return true;
}
}
void clear()
{
top=0;
}
};
main.cpp
#include"stack.h"
int main()
{
stack<int>sta(3);
sta.push(1);
sta.push(2);
sta.push(3);
sta.pop();
sta.push(4);
}
值得一提的是,我们的clear()只需要把top=0就好了,大家可以想一想为啥