栈相关知识点

栈(stack)

  • 分类
  • 概念及特点
  • 基本结构
  • 生活中的案例
  • 相关操作
  • 应用实例(进制转换)

分类

  1. 单链栈
  2. 顺序栈

概念

  操作在某一端受到限制,且有按一定顺序来进行的叫栈

特点

1. 操作(插入和删除)仅能在某一端进行
2. 并且相关操作,都遵循先进后出(FILO),后进先出(LIFO)

基本结构

 1. 栈底(base):不能进行插入,删除的一端
 2. 栈顶(top):可以进行插入,删除的一端(可以变化的)
 3. 按照顺序(连续的空间)  使用数组来表示

在这里插入图片描述

生活案例

1. 放取盘子
2. 火车进站

拿火车进站来说
火车总共有5(1,2,3,4,5)号车厢,但只允许2,3号车厢出站,如何解决
在这里插入图片描述 当然,出栈的顺序还可以根据实际情况而发生变化,比如还可以有以下几种
1. 1, 2, 3, 4, 5
2. 5, 4, 3, 2, 1
3. 2, 1, 5, 4, 3
前两种都是数据全进完,再出 第三种和这个火车进站性质一样

相关操作-链式栈

**插入数据(p),其值为E**
p ->next = top;
p = top;
**删除数据(p),其值为E**
p = top;
top = top->next;
free(E);

相关操作-顺序栈

假设有一个栈s,判断是否为空栈

s.base == s.top;

初始化

 s.base = 0;
 s.top = 0;

进栈

思路:数据先放进栈顶,然后栈顶位置向上移一位
s.[top] = data;
s.[top]++
注意:需要判断一下,栈是否为满栈

出栈

s.[top]--
d = s.d[s.top]

例题
找出其规律,就可以知道第i个元素出战位置
在这里插入图片描述

应用实例

#include <stdio.h> 
#include <stdlib.h>
#define max 100

//定义栈结构
struct stack {
	int base;
	int top;
	int data[max];
}; 
//分配空间,并初始化栈
struct stack * initstack(){
	struct stack *s;
	s = (struct stack *)malloc(sizeof(struct stack));
	s->base = 0;
	s->top = 0;
	return s;
};

//判断是否为空栈
int isempty(struct stack *s){
	if(s->top == s->base ){
		return 0;
	}else{
		printf("\n");
		return 1;
	}
}

//判断是否为满栈
void isfull(struct stack *s){
	if(s->top == max){
		printf("是满栈");
	}else
		printf("不是满栈");
}

//数据进栈
void push(struct stack *s, int data){
	s->data[s->top] = data;
	s->top++;
}

//数据出栈
int pop(struct stack *s){
	int data;
	s->top--;
	data = s->data[s->top];
	return data;
}
//二进制转换  注意:如果是十六进制,作了个判断(+55)
void dtor(struct stack *s, int n, int r){
	int d;
	d = n % r;
	while(n != 0){
		push(s, d);
		n = n / r;
		if(d >= 10){
			printf("%c", d + 55);
		}else{
			printf("%d", d);
		}
	}
	while(!isempty(s)){
		printf("%d", pop(s));
	}
	printf("\n");
}

int main(){
	struct stack *s;
	s = initstack();
	printf("%d", isempty(s));
	push(s, 2);
	printf("%d\n", isempty(s));
	printf("进制转换:\n");
	dtor(s, 10, 16);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值