| 数据结构(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函数判断空栈也是没有问题的,综上,我们完成了栈的表示和实现。
 链式栈链式栈的本质其实就是特殊的线性表,当线性表只能用尾插法插入元素并且只能从表的尾部提取元素,就是栈。这一部分我没有写代码,因为前面线性表的链式结构删掉一些函数就可以作为栈使用,所以再写一遍也是没有任何意义的,顶多练练手
 队列下次再说队列我们下次再叙述 |