顺序栈的实现–C 语言版,详细讲解+代码实现
前言
数据结构的栈结构,所谓栈结构,和链式结构比较起来,他都为线性表,不一样的是,操作(插入和删除)不一样,在链表中,插入方法有头插法和尾插法,删除也能遍历删除。
而在栈中,插入和删除改变了说法成为出栈和入栈,其中,出栈就是删除元素,入栈就是插入元素。
不过和链式表比起来,栈的入栈和出栈操作只能从栈的尾部进行操作。而这种操作比起来貌似也更为简单。
一、栈的结构定义
顺序栈,可以简单的理解为栈的操作方式的数组,就是说在数组上,插入和删除时只在数组的末尾进行操作。
而顺序栈的结构体,也分为两部分,一部分是数组,可以理解为栈的实体,另一部分为top,栈顶的位置,为了迎合索引从零开始的设定,当栈中没有元素时,top赋值为0,当栈中出现出栈和入栈的操作时,随着操作top进行相加减即可。
#define MAXSIZE 100
typedef int selement_type;
typedef struct shunxuzhan
{
selement_type data[MAXSIZE];
int top;
}SEQ_STACK;
二、操作步骤
1.初始化
top讲解的话建议看前言
这边就是初始化一个结构体,结构体中有一个长度为100的数组和一个含义为栈顶位置的整形。
int init_stack(SEQ_STACK *seq_stack){
seq_stack->top = -1;
return 1;
}
2.入栈操作
入栈时,首先确认一下栈是否满员,由于我们创立结构体的时候定义了栈顶位置top,所以可以根据top直接判断,而且top的初始值是-1,它的值一直比当前长度少一位,所以比较栈是否满员的时候需要将MAXSIZE和top+1进行比较,当满员时直接返回,否则插入栈顶位置。
- 判断栈是否满员
- 给top+1意为这栈的长度+1,且栈顶元素更改
- 将要压入栈的值赋给新的栈顶。
//插入
int insert(SEQ_STACK *seq_stack,int data){
if(seq_stack->top+1>=100){
return 0;
}else{
seq_stack->top++;
seq_stack->data[seq_stack->top]=data;
return 1;
}
}
3. 出栈操作
出栈操作时,首先也需要判断一下栈是否为空,由于定义top时,将其定义为,当栈为空的时候,top为-1,所以直接比较top即可。
当栈不为空的时候,进行删除,我当时写的时候本打算将top-1,然后将原本的栈顶元素置空,后来观察入栈操作发现,入栈的时候不会介意原本位置是否拥有数据,直接覆盖,而且栈的长度也有top负责管理,并不会出现问题。
所以写的时候只是将top-1,而并没有改变原本的栈顶元素的值。
- 判断栈是否为空
- 改变top的值,让top-1
//删除
int delete(SEQ_STACK *seq_stack){
if(seq_stack->top==-1){
return 0;
}else{
//seq_stack->data[seq_stack->top]=NULL;
seq_stack->top--;
}
}
4. 查看操作
这边的查看操作实际上是查看栈顶元素的操作,并非遍历。
- 判断栈是否为空
- 取出索引为top的数组的值。
//查看
int see(SEQ_STACK *seq_stack){
if(seq_stack->top==-1){
return 0;
}else{
int data = seq_stack->data[seq_stack->top];
printf("%d\n",data);
return 1;
}
}
5.尝试
int main(){
SEQ_STACK seq_stack;
init_stack(&seq_stack);
insert(&seq_stack , 1);
insert(&seq_stack , 2);
see(&seq_stack);
delete(&seq_stack);
see(&seq_stack);
return 1;
}