栈与队列
栈与队列可以理解为特别的链表(受限制的)。
那么什么是链表呢?
链表示意图
像这样的
我们成为一个节点一般我们是这样定义的
在结构体中
struct Node//这里访问权限为public
{
int data;//数据域,这里我们想使用int
Node * node;//指针域,用于指向下一个节点
}
在类中
class Node//这里数据为private访问权限
{
int data;//数据域,这里我们想使用int
Node * node;//指针域,用于指向下一个节点
}
就是这样由一个节点指向下一个节点来构成链表;
栈- 是什么?
1.栈又称堆栈。
2.是一种仅在表尾进行插入和删除操作的线性表。
3.表尾称为栈顶,相对地,把另一端称为栈底。
4.向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈
顶元素的上面,使之成为新的栈顶元素;
5.从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
在标准模板库中有哪些功能
实现(使用c++实现,按模板实现,课以把T看作int等数据类型)
定义头节点(使用类定义的)
template<class T>
class CNode
{
public:
CNode(T val);
~CNode();
void setList(CNode<T>* pNode);
CNode<T>* getNext();
T getData();
private:
T m_val;
CNode<T>* m_pNext;
};
下面是实现节点类中的函数
//实现构造函数
template<class T>
CNode<T>::CNode(T val):m_val(val), m_pNext(nullptr)
{ }
//实现析构函数
template<class T>CNode<T>::~CNode()
{
m_pNext = nullptr;
}
//建立链表
template<class T>
void CNode<T>::setList(CNode<T>* pNode)
{
m_pNext = pNode;
}
//下一个节点
template<class T>
CNode<T>* CNode<T>::getNext()
{
return m_pNext;
}
//节点里的数据
template<class T>
T CNode<T>::getData()
{
return m_val;
}
功能实现类(第一次写博客复制代码总是出问题就放图片了/狗头)
结果展示
这是测试代码
结果
队列-是什么
1.它只允许在表的表头进行删除操作。
2.进行插入操作的端称为队尾,进行删除操作的端称为队头。
在标准模板库中有哪些功能
实现(使用c++实现,按模板实现,课以把T看作int等数据类型)
定义头节点(使用类定义的)
实现节点中的代码
功能实现类(因为和栈差不多就不解释了)
实现功能
结果展示
测试代码
结果
从上面的结果中很容易看出来队列是先进先出,而栈是先进后出
那么能不能相互转化呢?下面我们来实现一下
多的不说直接上代码吧。
由栈到队列
首先是封装成类
下面是实现(直接使用模板库)
测试一下
结果
有队列到栈
测试代码
结果
在这里面都是用两个表来实现另外的一个表。
总结
1.受限的线性表:栈和队列;
2.栈:先进后出,类似于箱子。(FILO结构)
栈底:栈的底部。
栈顶:栈的顶部。
入栈:将元素添加到栈顶。
出栈:将栈顶元素移除。
3.队列:先进先出,类似于排队。(FIFO结构)
队头:队的头部。
队尾:队的尾部。
入队:将元素添加到队尾。
出队:将队头的元素移除。