大一新生必看,自学必看,里昂详解数据结构之堆栈

数据结构之堆栈

有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)

核心算法思想

堆栈,一种先进后出的线性表。仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
堆栈模型

核心算法实现

顺序栈结构描述如下:

typedef struct Stack
{
	Elemtype *top;
	Elemtype *base;
	int stacksize;
}SqStack;

初始化栈:

void IntiStack(sqstack *s)
{
	s->base = (Elemtype*)malloc(stack_init_size*sizeof(Elemtype));
	if (!s->base)
exit(0);
	s->top = s->base;   //设置栈为空 
	s->stacksize = stack_init_size;
}

入栈:

int Push(sqstack* s, Elemtype e)
{
	if (s->top - s->base >= s->stacksize)    //判断是否栈满 
	{
		s->base = (Elemtype*)realloc(s->base, (s->stacksize + stack_increment)*sizeof(Elemtype));
		if (!s->base)
			exit(0);
		s->top = s->base + s->stacksize;  //重新设置栈顶 
		s->stacksize += stack_increment; //重新设置栈的大小 
	}
	*(s->top) = e;
	s->top++;
	return 1;
}

出栈:

void Pop(sqstack* s, Elemtype *e)
{
	if (s->top == s->base)      //如果栈为空 
		return;
	*e = *--(s->top);
}

实践出真知,代码案例

编写一个程序,利用栈的先进后出的特点,实现对于输入的任意一个非负十进制整数,打印输出与其等值的二进制数。

案例源码

constexpr auto STACK_INIT_SIZE =  20;
constexpr auto STACKINCREACE =  20;
typedef char Elemtype;
typedef int Status;
typedef struct {
	Elemtype *top;
	Elemtype *base;
	int stacksize;
}SqStack;

Status InitStack(SqStack &S);
Status Push(SqStack &S, Elemtype e);
Status Pop(SqStack &s, Elemtype e);
Status StackEmpty(SqStack S);

Status InitStack(SqStack &S) {
	S.base = (Elemtype*)malloc(STACK_INIT_SIZE * sizeof(Elemtype));
	if (!S.base) { return false; }
	S.stacksize = STACK_INIT_SIZE;
	S.top = S.base;
	return true;
}

Status Push(SqStack &S, Elemtype e) {
	if (S.top - S.base >= S.stacksize) {
		S.base = (Elemtype*)realloc(S.base, (S.stacksize + STACK_INIT_SIZE) * sizeof(Elemtype));
		if (!S.base) { return false; }
		S.top = S.base + S.stacksize;
		S.stacksize += STACK_INIT_SIZE;
	}
	*S.top = e;
	S.top++;
	return true;
}

Status Pop(SqStack &S, Elemtype *e) {
	if (S.base == S.top) { return false; }
	else{
		*e = *--S.top;
	    return true;
	}
}

Status StackEmpty(SqStack S){
	if (S.base == S.top) { return true; }
	return false;
}

int main()
{
	int N;
	Elemtype e;
	SqStack stack;
	InitStack(stack);
	scanf_s("%d",&N);
	while (N)
	{
		Push(stack, N % 2);
		N = N / 2;
	}
	while (!StackEmpty(stack))
	{
		Pop(stack,&e);
		printf("%d",e);
	}
}

面试常见问题

栈和队列有什么相同和区别?
栈和队列都是一种特殊的线性表,只允许在端点处插入和删除元素,区别在于栈是先进后出,后进先出队列是先进先出,后进后出
(tips:下一博讲队列)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值