数据结构(c语言版) 第三章 栈和队列
栈(栈的表示和实现):
栈(stack)栈是限定仅在表尾进行插入或删除操作的线性表,因此表尾对栈有着特殊的含义,称为栈顶(top),相应表头成为栈底(bottom),不含元素的空表称为空栈。
因为栈的进出都是从表尾进行插入和删除,于是又叫后进先出(last in first out)也能叫先进后出。
- 线性表类似,对于栈来说,也有两种存储结构(1)顺序栈(2)链式栈
(1)顺序栈:
顺序栈的结构结构体单位我们一般有两个指针和一个整型数据,其中整型数据代表此时栈的总空间大小,其中一个指针始终指向栈底,另一个指针始终指向栈顶。
当两个指针指向同一个位置时,那么此时就是空栈。
栈的结构的实现
struct stacks{
int *base;
int *top;
int stacksize;
};
开辟一个栈
void creatstack(struct stacks *s,int size){
s->base = (int*)malloc(size*sizeof(int));
if(!s->base)exit(0);
s->top = s->base;
s->stacksize = size;
}
向栈中压入元素
void push(struct stacks *s,int elements){
if(s->top-s->base>=s->stacksize){
s->base = (int*)realloc(s->base,(s->stacksize+1)*sizeof(int));
if(!s->base)exit(0);
*(s->top) = elements;
s->top = s->base + s->stacksize+1;
s->stacksize ++;
}else{
*(s->top) = elements;
s->top ++;
s->stacksize ++;
}
}
将栈顶的元素取出
void pop(struct stacks *s){
if(s->base!=s->top){
s->stacksize --;
int *x = s->top;
s->top --;
}else{
exit(0);
}
}
判断一个栈是不是空栈
int emptys(struct stacks *s){
if(s->base==s->top)return 1;
else return 0;
}
完整的代码
#include <stdio.h>
#include <stdlib.h>
struct stacks{
int *base;
int *top;
int stacksize;
};
void creatstack(struct stacks *s,int size){
s->base = (int*)malloc(size*sizeof(int));
if(!s->base)exit(0);
s->top = s->base;
s->stacksize = size;
}
void push(struct stacks *s,int elements){
if(s->top-s->base>=s->stacksize){
s->base = (int*)realloc(s->base,(s->stacksize+1)*sizeof(int));
if(!s->base)exit(0);
*(s->top) = elements;
s->top = s->base + s->stacksize+1;
s->stacksize ++;
}else{
*(s->top) = elements;
s->top ++;
s->stacksize ++;
}
}
int emptys(struct stacks *s){
if(s->base==s->top)return 1;
else return 0;
}
void pop(struct stacks *s){
if(s->base!=s->top){
s->stacksize --;
int *x = s->top;
s->top --;
}else{
exit(0);
}
}
void printstack(struct stacks *s){
for(int *i = s->base;i < s->top;i ++){
printf("%d ",*i);
}
}
int main(){
struct stacks s;
creatstack(&s,10);
for(int i = 1;i <= 4;i ++){
int x;
scanf("%d",&x);
push(&s,x);
}
pop(&s);
printstack(&s);
pop(&s);
pop(&s);
pop(&s);
printf("\n%d",emptys(&s));
}
验证push
- 这里最后我用了三个pop函数将栈中的所有元素都给删除了。
- 让我们验证一下我们写的代码是否正确。
- 先输入四个数验证一些push函数
验证pop
- 显然输入了四个数,也输出了四个数,我们的push函数是没有问题。
- 接下来我们验证pop函数,输入四个数,并pop一次。
- 显然输入四个数,输出三个数,并且按照栈的后进先出规则,删除的是栈顶的元素,即最后一个元素,所以输出三个数是正确的,pop函数没问题。
验证empty
- 最后验证一下empty函数
- 先输入四个数,并pop一次,此时栈还有三个元素,所以empty函数应该输出0(假值)。
- 输出的值是0,说明empty对栈内有元素的判断是没有问题的。
- 接下来输入四个数并全部pop出去,看一下empty函数是否正确。
- 最后输出的是1(真值),所以empty函数判断空栈也是没有问题的,综上,我们完成了栈的表示和实现。
链式栈
- 链式栈的本质其实就是特殊的线性表,当线性表只能用尾插法插入元素并且只能从表的尾部提取元素,就是栈。
这一部分我没有写代码,因为前面线性表的链式结构删掉一些函数就可以作为栈使用,所以再写一遍也是没有任何意义的,顶多练练手
队列下次再说
队列我们下次再叙述
|