栈数据结构

栈是一种先进后出的数据结构,可以分为:顺序栈和链式栈

一、顺序栈

 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();
}

 运行结果如下:


三、栈的应用

  • 函数调用,递归调用
  • 中断
  • 表达式求值
  • 内存分配
  • 缓冲处理
  • 迷宫

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值