数据结构与算法2.1.1->2.2.2 24.1.11

本文介绍了多重链表的概念,用于表示稀疏矩阵的存储方法,以及堆栈数据结构的原理,包括后缀表达式的求值和堆栈的顺序存储实现。通过示例展示了如何在结构体中实现堆栈的入栈和出栈操作,以及双堆栈的设计和操作。
摘要由CSDN通过智能技术生成
typedef struct GNode* Glist;
struct GNode {
	int tag;//标志域:0表示结点是单元素,1表示结点是广义表
	union //将不同类型数据联合,两种类型数据共用一个存储空间
	{
		ElementType Data;
		Glist SubList;
	}URegion;
	Glist Next;//指向后结点
};
/*2.1

多重链表:链表的结点可能隶属于多个链
多重链表的指针域会有多个,但包含两个指针域的链表不一定是多重链表,比如双向链表
多重链表有广泛的用途,树、图这样相对复杂的数据都可以采用多重链表的方式实现存储

eg矩阵可以用二维数组表示,但是1.数组大小需要事先确定2.稀疏矩阵(0比较多),会造成空间浪费
用十字链表存储稀疏矩阵
1.只存储矩阵的非零值
结点的数据域:行坐标Row,列坐标Value
2.每个结点通过两个指针域,把同行同列串起来
行指针Right(向右指针)
列指针Down(向下指针)

*/

/*2.2
堆栈
算术表达式:运算数,运算符号
不同运算符号的优先级不一样
中缀表达式(难以求值,有运算符的优先级之分)
后缀表达式(容易求值,在看见符号时就知道与前面的数字做什么运算)
 从左到右,处理运 算符前面的两个数字做运算
 时间复杂度为线性
 堆栈:具有一定操作约束的线性表
 插入数据:入栈Push
 删除数据:出栈Pop
 后入先出:LIFO(Last In First Out)
 类似于堆盘子

 抽象数据类型描述:
 类型名称:堆栈
 数据对象集:一个有0个或多个元素的有穷线性表
 操作集:长度为MaxSize的堆栈属于Stack,堆栈元素item属于ElementType
 Stack CraetStack(int MaxSize):生成空堆栈,其最大长度为MaxSize
 int IsFull(Stack S ,int MaxSize):判断堆栈是否已满
 void Push(Stack S ,ElementType item):将元素item压入堆栈
 int IsEmpty(Stack S):判断堆栈S是否为空 ;
 ElementType Pop(Stack S):删除并返回堆栈顶元素

 栈的顺序存储实现
 栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成
*/
//ElementType表示一种数据类型,可以是整形也可以是实型,也可以是结构
#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)--]);
	
}
//两个堆栈,从两边往中间堆,两边的指针相遇时,就满了

typedef struct  DNode {
	ElementType Data[MaxSize];
	int Top1;
	int Top2;
}S;
S.Top1 = -1;
S.Top2 = MaxSize;
//入栈
void Push2(struct DNode* PtrS, ElementType item, int Tag)
{
//Tag作为两个堆栈的区分标志,取值为1,2
	if (PtrS->Top2 - PtrS->Top1 == 1) {
		printf("堆栈满");
	}
	if (Tag == 1) {
		PtrS->Data[++(PtrS->Top1)] = item;
	}//操作第一个堆栈
	else//操作第二个堆栈
		PtrS->Data[--(PtrS->Top2)] = item;
}
void Pop2(struct DStack* PtrS, int Tag) {
	if (Tag == 1) {
		if (PtrS->top1 == -1) {
			printf("堆栈1空");
			return NULL;
		}
		else return PtrS->Data[(PtrS->Top1)--];
	}
	if (PtrS->Top2 == MaxSize) {
		printf("堆栈2满");
		return NULL;
	}
	else return PtrS->Data[(PtrS->Top2)++];
}

仅作个人笔记

注意结构体指针,数组指针的定义

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值