一、栈图解
二、基本概念
栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
三、基本算法
1.进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2.退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
四、结果
五、Code
stack.c
#include "stack.h"
void init_stack(t_stack * s)
{
s->top = -1; // 初始化栈
}
int push(t_stack * s,char dat)
{
if(s->top == (STACK_MAX_SIZE - 1)) // 栈满
return STACK_ERR;
(s->top)++;
s->data[s->top] = dat;
return STACK_OK;
}
int pop(t_stack * s,char *dat)
{
if(s->top == -1) // 栈空
return STACK_ERR;
*dat = s->data[s->top];
(s->top)--;
return STACK_OK;
}
int stack_test(void)
{
char send_buf[8] = {"12345678"};
char recv_buf[8];
char i;
t_stack s_stack;
init_stack(&s_stack);
for(i = 0;i < 8; i++)
push(&s_stack,send_buf[i]);
for(i = 0;i < 8; i++)
pop(&s_stack,&recv_buf[i]);
return 0;
}
stack.h
#ifndef _STACK_H_
#define _STACK_H_
#define STACK_MAX_SIZE 512
#define STACK_OK 0
#define STACK_ERR -1
typedef struct{
char data[STACK_MAX_SIZE]; // 栈大小
int top; // 栈顶
}t_stack,pt_stack;
extern void init_stack(t_stack * s); // 初始化栈
extern int push(t_stack * s,char dat); // 入栈
extern int pop(t_stack * s,char *dat); // 出栈
extern int stack_test(void); // 测试函数
#endif