栈是一种先进后出的数据结构,可以分为:顺序栈和链式栈
一、顺序栈
1、其结构如下图所示:
2、栈的基本操作,只有如下的七个(具体用法)
- push( ) 入栈
- pop( ) 出栈
- empty( ) 是否为空
- top( ) 返回栈顶元素
- size( ) 返回栈中元素个数
- swap() 交换
- emplace()
#include<iostream>
#include<stack>
#include<string>
using namespace std;
void StackOperator(int num)
{
stack<int> s1;
for (int i = 0; i < num; i++)
{
s1.push(i); // 入栈操作
}
cout << "s1栈的大小为:" << s1.size() << endl;
// 遍历栈中的元素
while (!s1.empty())
{
// 将栈顶的元素输出
cout << s1.top() << " ";
// 将当前栈顶的元素删除,让下一个元素成为栈顶元素
s1.pop();
}
cout << endl;
}
int main()
{
StackOperator(10);
cin.get();
}
3、注意:栈与vector容器的异同
- 栈和vector容器都是从末尾插入新元素。
- 栈只能先进后出,从最后一个开始元素输出;而vector容器是从头开始输出数据,通过 v.begin()来进行。
二、链式栈
1、链式栈是用链表的方式来进行连接的。如下图所示,pTop 指向开头,pBotton 指向结尾。一般为了处理方便,让 pBotton 指向一个空结点,即最后一个结点的数据为空。
2、创建一个链式栈
(1)、创建栈的第一个结点,并用 pTop、pBotton 来对其进行初始化。此时 pTop、pBotton 均指向该栈的第一个结点。
// 创建栈的第一个结点,并用头指针和尾指针指向它
void InitStack(PSTACK p)
{
// 使用malloc动态申请一个NodeList类型的内存空间,并用pTop指针指向它
p->pTop = (PNODE)malloc(sizeof(NODE));
if (p->pTop==NULL)
{
cout << "内存分配失败" << endl;
}
else
{
p->pBotton = p->pTop;
p->pTop->next = NULL;
}
}
(2)、将第一个元素压入到栈中,成为该栈的第二个结点
// 将元素压入到创建的栈中
void PushElem(PSTACK p1,int val)
{
PNODE pNew = new NODE();
pNew->data = 20;
pNew->next = p1->pTop;
p1->pTop = pNew;
}
(3)、将第三、四个元素分别压入到栈中,如下图
3、实例
#include<iostream>
#include<malloc.h>
#include<string>
using namespace std;
// 定义一个结点
// NODE 相当于 NodeList的别名
// *PNODE 相当于 NodeList* 类型
typedef struct NodeList
{
int data;
NodeList * next;
}NODE, *PNODE;
//自定义一个栈的结构体类型,存放头指针和尾指针
typedef struct Stack
{
PNODE pTop;
PNODE pBotton;
}STACK, *PSTACK;
// 创建栈的第一个结点,并用头指针和尾指针指向它
void InitStack(PSTACK p)
{
// 使用malloc动态申请一个NodeList类型的内存空间,并用pTop指针指向它
p->pTop = (PNODE)malloc(sizeof(NODE));
if (p->pTop==NULL)
{
cout << "内存分配失败" << endl;
}
else
{
p->pBotton = p->pTop;
p->pTop->data = 10;
p->pTop->next = NULL;
}
}
// 将元素压入到创建的栈中
void PushElem(PSTACK p1,int val)
{
// 方法二
PNODE pNew = new NODE();
pNew->data = val;
pNew->next = p1->pTop;
p1->pTop = pNew;
}
// 遍历栈中所有元素
void TraverseStack(const PSTACK pS)
{
PNODE p = pS->pTop;
while (p!=pS->pBotton)
{
cout << p->data << endl;
p = p->next;
}
}
// 出栈操作,删除栈顶的元素
void PopStack(PSTACK pS)
{
PNODE p = pS->pTop;
pS->pTop = pS->pTop->next;
delete p;
}
int main()
{
STACK s;
InitStack(&s);
PushElem(&s, 10);
PushElem(&s, 20);
PushElem(&s, 30);
PushElem(&s, 40);
TraverseStack(&s);
cout << "-------------------------------\n";
PopStack(&s);
TraverseStack(&s);
cin.get();
}
运行结果如下:
三、栈的应用
- 函数调用,递归调用
- 中断
- 表达式求值
- 内存分配
- 缓冲处理
- 迷宫