【陈越 数据结构】第二讲 线性结构2-堆栈&队列

2.2堆栈

2.2.1什么是堆栈

堆栈是一个线性结构,也是一个特殊的线性表。函数调用、递归、表达式求值都要用到堆栈
例:计算机如何进行表达式求值?
算数表达式由两类对象构成:运算数,如2、3、4,运算符号,如+、-、*、/,不同运算符号优先级不一样。
中缀表达式:运算符号位于两个运算数之间。
后缀表达式:运算符号位于两个运算数之后。
在这里插入图片描述
后缀表达式求值策略:从左向右扫描,逐个处理运算数和运算符号
遇到运算数则记住,遇到运算符号则处理最近储存的两个运算数
启示:需要有种存储方法,能顺序存储运算数,并在需要时倒序输出。

堆栈的抽象数据类型描述
堆栈(stack):具有一定操作约束的线性表
只在一端(栈顶,Top)做插入、删除
插入数据:入栈(Push)
删除数据:出栈(Pop)
后入先出:Last In First Out(LIFO)
在这里插入图片描述
在这里插入图片描述

其中最重要的就是push和pop步骤:
在Python中,对于一个数组,.pop()方法就是删除最后一个元素。
在这里插入图片描述

2.2.2 用数组实现堆栈

一个很自然的想法,把堆栈用一个数组表示:
在这里插入图片描述

#define MAXSIZE <储存数据元素的最大个数>
typedef struct SNode* Stack;
struct SNode{
	ElementType Data[MAXSIZE];
	int Top;
};

入栈:

void push(Stack PtrS,ElementType item)
{
	if(PtrS->Top == MAXSIZE - 1)
	{
		printf("堆栈满");
		return;
	}
	else
	{
		PtrS->Data[++(PtrS->Top)] = item;
		return ;
	}
 }

出栈:

ElementType pop(Stack PtrS)
{
	if(PtrS->Top == -1)
	{
		printf("堆栈空");
		return ERROR;	//ERROR是ElementType的特殊值,标记错误 
	}
	else
	{
		return (PtrS->Data[(PtrS->Top)--]);
	}
 } 

在这里插入图片描述

tag来区别第一个和第二个堆栈:
在这里插入图片描述
在这里插入图片描述

2.2.3 用链表实现堆栈

链表是双向的,则只能把链表的头部当作top,不能用链表的尾部。
push:插在链表的top位置,如右边的图。
在这里插入图片描述
因为链表是不断地申请新的空间,而数组是固定长度的,因此不需要判别链表有没有满。

pop:
如下图,红色部分很易懂。
在这里插入图片描述
注意最后要free()释放掉删除元素的空间。

2.2.4堆栈应用:表达式求值

从左到右读入后缀表达式的各项(运算符或运算数):
1.运算数:入栈;
2.运算符:从堆栈中弹出适当数量的运算数,计算并结果入栈;
3.最后,堆栈顶上的元素就是表达式的结果值。
中缀表达式求值
基本策略:将中缀表达式转换为后缀表达式,然后求值
中缀表达式与后缀表达式:1.运算数相对顺序不变;2.运算符号顺序发生改变:需要存储等待中的运算符号;要将当前运算符号与等待中的最后一个运算符号比较
中缀表达式如何转换为后缀表达式:
从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理。
1.运算数:直接输出;
2.左括号:压入堆栈;
3.右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出)
4.运算符:若优先级大于栈顶运算符时,把它压栈;
若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出,再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈;
5.若各对象处理完毕,则把堆栈中存留的运算符一并输出
堆栈的其他应用:函数调用及递归实现;深度优先搜索;回溯算法……

2.3 队列

队列和堆栈一样,也是一种受限制的线性表。
队列:具有一定操作约束的线性表
插入和删除操作:只能在一端插入,而在另一端删除
(与堆栈不同的是两端操作)
数据插入:入队列(AddQ)
数据删除:出队列(DeleteQ)
先来先服务
先进先出:FIFO

2.3.1 队列的数组实现

在这里插入图片描述

#define MAXSIZE <储存数据元素的最大个数>
struct QNode{
	ElementType Data[MAXSIZE];
	int front; #头指针
	int rear; #尾指针
}; 
typedef struct QNode* Queue

在这里插入图片描述

在这里插入图片描述
队列空:front == rear
这种方案使队列空和满时无法分辨,因为rear和front距离有n种情况,而在队列中摆放的元素个数情况有n+1种,无法用rear和front的距离全部表示出队列中所有的元素个数情况。
解决方案:1.使用额外标记:Size或tag域。2.仅使用n-1个数组空间


感觉有点看不下去了。。暂时先看到这里~


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值