栈之栈的顺序存储
栈(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.