顺序结构——顺序栈

今天说的是顺序栈。
而对于栈,我们最直观的了解就是它的先进后出原则,就和一群人走进的狭窄的死胡同是一样的,先进入的人被堵在里面,而后进入的人则可以先出去。
对于栈来说,当你的栈已满时,继续存入数据就会产生上溢
相对的,当栈为空栈时,继续出栈则会产生下溢
接下来,我们继续用一组代码,来看看顺序栈的一些操作

#include<stdio.h>
#include<stdlib.h> 

#define STACK_SIZE 100 //初始的储存空间 
#define STACK 10 //储存空间分配的增量 

typedef struct stcak{
	int *base; //基地址 
	int *top; //栈顶 
	int stacksize; //栈容量 
} *Stack;

/*初始化顺序栈*/ 
Stack initStack(Stack s){
	s = (Stack)malloc(sizeof(Stack)); 
	if(!s){
		exit(0);
	}
	
	s->base = (int*)malloc(STACK_SIZE * sizeof(int)); //分配足够多的地址 
	
	if(!s->base){  
		exit(0);
	}
	
	s->top = s->base; 
	s->stacksize = STACK_SIZE;
	return s;
}

/*判断空栈*/
int IsEmpty(Stack s){
	if(s->top == s->base){ //空栈 
		return 1;
	}else{
		return 0;
	}
} 

/*是否栈满*/
int Full(Stack s){
	if(s->top - s->base == s->stacksize){ //栈满 
		return 1;
	}else{
		return 0;
	}
}

/*顺序栈入栈*/ 
void Push(Stack s, int e){
	if(Full(s)){ //栈满 
	 s->base = (int *)malloc((STACK_SIZE + STACK) * sizeof(int)); //增加base的空间 
	 if(!s->base){ //储存分配失败 
	 	exit(0);
	 }
	 s->top = s->base + s->stacksize;
	 s->stacksize += STACK;
	}
	*s->top++ = e;
}

/*顺序栈出栈*/
int pop(Stack s){
	if(s->top == s->base){
		return 0;
	}else{
		return *(--s->top); //s->top移动 
	}
} 

/*访问栈顶*/
int GetTop(Stack s){
	if(s->top == s->base){
		return 0;
	}else{
		return *(s->top-1);//s->top未移动 
	}
} 

/*顺序栈销毁*/
void DestroyStack(Stack s){
	free(s->base);
	free(s);
}

int main(){
	Stack s = NULL;
	s = initStack(s);
	int i;
	for(i = 0; i < 5; i++){
		Push(s,i);
	}
	for(i = 0; i < 5; i++){
		printf("此时的栈顶为:%d\n",GetTop(s));
		printf("此时出栈的是:%d\n",pop(s));
	}
	DestroyStack(s);
	return 0; 
}
发布了14 篇原创文章 · 获赞 3 · 访问量 695

猜你喜欢

转载自blog.csdn.net/qq_44961028/article/details/99958751