栈之栈的顺序存储

栈(stack):

再来说说栈的几个概念与常见操作:

 

栈的设计思路:

 

下面说一下栈的顺序存储原理:

 

具体代码设计思想:

 

 话不多说,直接上代码:

stack.h:

#ifndef _STACK_H_
#define _STACK_H_
#define EMPTY_INDEX -1 //代表栈里面没有元素
#define MAX_SIZE 100 //这里设计可以大一点,防止数据溢出
//定义抽象的数据存放类型
typedef int element_type;//以后不想要这个类型就从这改

typedef struct _t_seq_stack
{
	int top_of_index;//当前栈顶的索引角标
	element_type array[MAX_SIZE];
}t_seq_stack;


//创建栈
t_seq_stack *create_stack();
//判断栈是否为空
int is_empty(t_seq_stack *stack);
//销毁栈
void destroy_stack(t_seq_stack *stack);
//从理论上清空栈,也就是把长度变为-1,但是元素还是存放在相应的数组空间
void make_empty(t_seq_stack *stack);
//出栈,从理论上出栈,数据还是存在元素中
void pop_stack(t_seq_stack *stack);
//入栈
void push_stack(t_seq_stack *stack,element_type value);
//拿到栈顶元素
element_type top_stack(t_seq_stack *stack);


#endif

stack.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"

//创建栈
t_seq_stack *create_stack()
{
	t_seq_stack *stack = (t_seq_stack*)malloc(sizeof(t_seq_stack));
	if(stack != NULL) {
		stack->top_of_index = EMPTY_INDEX;
		//初始化这片空间
		memset(stack->array,0,sizeof(element_type)); 
	}
	return stack;
}
//判断栈是否为空
int is_empty(t_seq_stack *stack)
{
	int res = -1;
	if(stack != NULL) {
		res = stack->top_of_index == EMPTY_INDEX;		
	}
	return res;
}
//销毁栈
void destroy_stack(t_seq_stack *stack)
{
	if(stack != NULL) {
		free(stack);
	}
}
//从理论上清空栈,也就是把当前索引变为-1,但是元素还是存放在相应的数组空间
void make_empty(t_seq_stack *stack)
{
	if(stack != NULL) {
		stack->top_of_index = EMPTY_INDEX;
	}
}
//出栈,从理论上出栈,数据还是存在元素中
void pop_stack(t_seq_stack *stack)
{
	if(stack != NULL) {
		stack->top_of_index--;//这里相当于是改变top的位置
	}
}
//入栈
void push_stack(t_seq_stack *stack,element_type value)
{
	if(stack != NULL) {
		stack->array[++stack->top_of_index] = value;
	}
}
//拿到栈顶元素
element_type top_stack(t_seq_stack *stack)
{
	if(stack == NULL || is_empty(stack)) {
		printf("访问出错\n");
	} else {
		return stack->array[stack->top_of_index];
	}
}

main.c

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

int main() {
	element_type value1 = 1;
	element_type value2 = 2;
	element_type value3 = 3;
	t_seq_stack *stack = create_stack();
	printf("栈里面的元素个数:%d\n",stack->top_of_index + 1);//因为从-1开始的	
	//向栈里面插入元素
	push_stack(stack,value1);
	push_stack(stack,value2);
	push_stack(stack,value3);		
	printf("栈里面的元素个数:%d\n",stack->top_of_index + 1);

	//循环出栈
	while(!is_empty(stack)) {
		//然后我们获取栈顶元素,然后不断出栈
		element_type value = top_stack(stack);
		printf("%d\n",value);
		pop_stack(stack);//这里就是不停将索引往后减
	}

	destroy_stack(stack);
	return 0;
}

执行结果:

我们可以看到,进去的时候是1 2 3,出来的时候是 3 2 1.