栈(stack)
- 分类
- 概念及特点
- 基本结构
- 生活中的案例
- 相关操作
- 应用实例(进制转换)
分类
- 单链栈
- 顺序栈
概念
操作在某一端受到限制,且有按一定顺序来进行的叫栈
特点
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);
}