什么是栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的算法实现
1:进栈
1)、如果top>n(n为你栈里能存的最大元素个数),则不进行下面操作。(在近栈时应该判断栈是否已满)
2)、将top+1.
3)、将数据导入。
2:出栈
1)、判断栈是否为空。
2)、直接将top-1;
程序实现
1.stack.h
#ifndef _STACK_H_
#define _STACK_H_
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int data_t;
typedef struct {
data_t data[MAXSIZE];
int top;
}stack_t;//定义结构体
stack_t* stack_create();//申请动态空间
void stack_clear(stack_t *s);//清空栈
void stack_destroy(stack_t** s);销毁栈
int is_empty(stack_t* s);//判断空
int is_full(stack_t* s);//判断满
int get_length(stack_t* s);//计算长度
void stack_show(stack_t* s);//打印
int stack_push(stack_t* s, data_t data);//放入数据
data_t stack_pop(stack_t* s);//取数据
#endif
2.stack.c
#include "stack.h"
stack_t* stack_create()
{
stack_t* s = (stack_t*)malloc(sizeof(stack_t));
if (s == NULL)
return NULL;
s->top = -1;
return s;
}
void stack_clear(stack_t* s)
{
s->top = -1;
}
void stack_destroy(stack_t** s)
{
free(*s);
*s = NULL;
}
int is_empty(stack_t* s)
{
return s->top == -1;
}
int is_full(stack_t* s)
{
return s->top == MAXSIZE - 1;
}
int get_length(stack_t* s)
{
return s->top + 1;
}
void stack_show(stack_t* s)
{
int i = 0;
for (; i < s->top + 1; i++)
printf("%d ", s->data[i]);
printf("\n");
}
int stack_push(stack_t* s, data_t data)
{
if (is_full(s))
return -1;
s->top += 1;
s->data[s->top] = data;
return 0;
}
data_t stack_pop(stack_t* s)
{
if (is_empty(s))
return -1;
data_t temp;
temp = s->data[s->top];
s->top -= 1;
return temp;
}
3main.c
#include "stack.h"
int main()
{
stack_t* stack = stack_create();
if (stack == NULL)
return -1;
printf("stack address:%p\n", stack);
int i = 1;
while (i < 20) {
stack_push(stack, i);
i++;
}
stack_show(stack);
printf("out : %d\n", stack_pop(stack));
printf("out : %d\n", stack_pop(stack));
printf("out : %d\n", stack_pop(stack));
printf("out : %d\n", stack_pop(stack));
printf("len = %d\n", get_length(stack));
stack_destroy(&stack);
printf("stack address:%p\n", stack);
}