数据结构栈的分析笔记

存取位置受限的线性表。插入和删除位置受限制,只能从栈顶插入和删除,形成了“先进后出”的现象。

顺序栈

特点

1、存储结构由一块连续的存储单元组成。
2、栈底为第一个元素a1的地址,为低地址。栈顶为最后一个元素的an的地址,为高地址。

结构体定义

typedef struct {
	SElemType *base;//栈底指针
	SElemType *top;//栈顶指针
	int stackSize;
}SqStack;

1、顺序栈在存储时,内存地址是连续的。所以这里采用的是通过两个指针来记录栈内元素位置。栈底指针base在开辟连续地址时存储首地址位置,栈顶指针top来记录当前栈内最后一个元素的下一个位置。
2、顺序栈是有固定长度的,所以在插入时进行栈满的判断。

入栈

int Push(SqStack &S,SElemType e){
	//对栈满判断
	if(S.top - S.base == S.stackSize){
		return 1;
	}
	*S.top++ = e;//先将数据插入至S.top处,再将top增1
	return 0;
}

出栈

int Pop(SqStack &S,SElemType &e){
	//对栈空判断
	if(S.top == S.base){
		return 1;
	}
	e = *--S.top;//先将top减1,再取数值
	return 0;
}

区分出栈和取栈顶元素的不同:出栈e = *--S.top,取栈顶元素e = *(S.top-1)

链栈

特点

1、在物理存储中,存储空间并不连续。
2、链栈为了方便插入和删除操作的实现,没有头节点,那么判空条件就是S == NULL;
3、栈顶指针同时充当链表的头指针。

结构体定义

typedef struct StackNode{
	SElemType data;
	struct StackNde *next;
}StackNode,*LinkStack;

入栈

int Push(LinkStack &S,SElemType e){
	//链栈不进行栈满判断,插入原理同链表的“头”插法
	LinkStack p = new StackNode;
	p->data = e;
	p->next = S;
	S = p;
	return 0;

出栈

int Pop(LinkStack &S,SElemType &e){
	LinkStack p = new StackNode;
	p = S;
	e = S->data;
	S = S->next;
	delete p;
	return 0;

其他

进制转换

要求

将输入的十进制数字转换为二进制数字输出。

原理

将十进制数模2取余的结果顺序通过栈的特殊结构颠倒过来。

void conversion(){
	LinkStack S;
	int N = 0,e = 0;
	InitStack(S);
	scanf("%d",&N);
	while(N != 0){
		Push(S,N%2);
		N = N/2;
	}
	while(!IsEmpty(S)){
		Pop(S,e);
		pritf("%d",e);
	}
}

以上均为栈相关内容的个人理解,欢迎大家指正!谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万宝炉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值