浙大数据结构——2.2堆栈

什么是堆栈

具有一定操作约束的线性表。表达式求值,就是堆栈的应用。

后缀表达式

平常生活中所用的是中缀表达式。而计算机需要使用后缀表达式。

堆栈的抽象数据类型描述

类型名称:堆栈

数据对象集:一个有0个或多个元素的有穷线性表。

操作集:生成空堆栈、判断堆栈是否已满、将元素item压入堆栈、判断堆栈是否为空、删除并返回栈顶元素。

堆栈的顺序存储实现

1、结构体

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

2、操作

(1)入栈

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

(2)出栈

ElementType Pop(Stack PtrS){
	if(PtrS->Top == -1){
		printf("堆栈空");
		return ERROR;
	}else{
		return(PtrS->Data[(PtrS->Top)--]);
	}
}

eg:用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就能成功。

提示:头尾分别作为两个堆栈的栈顶,入栈时则可从头尾开始push,直到两个堆栈

堆栈的链式存储实现

1、结构体

typedef struct SNode *Stack;
struct SNode{
	ElementType Data;
	struct SNode *Next;
};

2、操作

(1)构建新链栈

Stack CreateStack(){
	Stack s;
	s = (Stack)malloc(sizeof(struct SNode));
	s -> Next = NULL;
	return S;
}

(2)判断是否为空

int IsEmpty(Stack S){
	return (S->Next == NULL);
}

(3)push操作

void Push(ElementType item, Stack S){
	struct SNode *TmpCell;
	TmpCell=(struct SNode *)malloc(sizeof(struct SNode));
	TmpCell->Next=S->Next;
	S->Next=TmpCell;
}

(4)pop操作

ElementType Pop(Stack S){
	struct SNode *FirstCell;
	ElementType TopElem;
	if(IsEmpty(S)){
		printf("堆栈空");
		return NULL;
	}else{
		FirstCell=S->Next;
		S->Next=FirstCell->Next;
		TopElem=FirstCell->Element;
		free(FirstCell);
		return TopElem;
	}
}

注:S代表栈顶。

中缀表达式如何转换为后缀表达式

从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理。

1、运算数直接输出

2、左括号压入堆栈

3、右括号将栈顶的运算符弹出并输出,直到遇到左括号

4、运算符:如果优先级大于栈顶元素,则压栈;反之,则弹出并输出,并比较新的栈顶元素,直到该运算符优先级大于栈顶运算符为止。然后将该运算符压栈。

5、若对象处理完毕,则把堆栈中存留的运算符一并输出。

堆栈的其他应用

函数的调用及递归实现

深度优先搜索

回溯算法

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值