我要成为嵌入式高手之3月21日数据结构第四天!!
————————————————————————————
栈
先进后出、后进先出
一、系统栈
大小:8MB
1、局部变量
2、未经初始化为随机值
3、代码执行到变量定义时为变量开辟空间
4、当变量的作用域结束时回收空间
5、函数的形参和返回值
6、函数的调用关系、保护现场和恢复现场
7、栈的增长方向,自高向低增长
二、栈:FILO
怎样具备先进后出、后进先出?
类似羽毛球桶
FILO(栈)
只允许从一端进行数据的插入和删除的线性存储结构(线性表)(一对一的线性存储结构,与顺序表、链式表类似)
插入:入栈、压栈 — 栈顶(允许操作)
删除:出栈、弹栈 — 栈底(不允许操作)
顺序表——顺序栈
满增栈 满减栈 空增栈 空减栈
入栈时操作方法不同
满、空栈
栈顶所在位置是否存有元素
增、减栈
取决于栈增长的方向
增:栈顶由低地址向高地址
减:栈顶由高地址向低地址
链式表——链式栈
栈顶、栈底
栈的基本操作:
注:只针对于链式栈
1、创建栈
/* 创建栈 */
STACK_LIST *CreateStackList()
{
STACK_LIST *plist = malloc(sizeof(STACK_LIST));
if (NULL == plist)
{
perror("fail to malloc list");
return NULL;
}
plist->ptop = NULL;
plist->clen = 0;
return plist;
}
2、入栈
/* 入栈 */
int JoinStrackNode(STACK_LIST *plist, DATA_TYPE data)
{
STACK_NODE *pnode = malloc(sizeof(STACK_NODE));
if (NULL == pnode)
{
perror("fail to malloc pnode");
return -1;
}
pnode->data = data;
pnode->pnext = NULL;
pnode->pnext = plist->ptop;
plist->ptop = pnode;
plist->clen++;
return 0;
}
3、出栈
/* 出栈 */
int LeaveStackNode(STACK_LIST *plist_in, STACK_LIST *plist_out)
{
STACK_NODE *pfree = NULL;
if (NULL == plist_in->ptop)
{
return -1;
}
else
{
pfree = plist_in->ptop;
plist_in->ptop = plist_in->ptop->pnext;
pfree->pnext = NULL;
plist_in->clen--;
}
f (NULL == plist_out->ptop)
{
plist_out->ptop = pfree;
}
else
{
pfree->pnext = plist_out->ptop;
plist_out->ptop = pfree;
plist_out->clen++;
}
return 0;
}
4、获取栈顶元素
/* 获取栈顶元素 */
STACK_NODE *GetStackTop(STACK_LIST *plist)
{
if (NULL == plist->ptop)
{
return NULL;
}
else
{
return plist->ptop;
}
}
5、清空栈
/* 清空栈 */
int DeleteStackAll(STACK_LIST *plist)
{
STACK_NODE *ptmp = plist->ptop;
STACK_NODE *pfree = NULL;
if (NULL == plist->ptop)
{
return -1;
}
while (ptmp != NULL)
{
pfree = ptmp;
ptmp = ptmp->pnext;
plist->ptop = ptmp;
free(pfree);
}
return 1;
}
6、销毁栈
/* 销毁栈 */
int DestroyStack(STACK_LIST *plist)
{
int ret = 0;
if (NULL == plist->ptop)
{
free(plist);
}
else
{
ret = DeleteStackAll(plist);
if (1 == ret)
{
free(plist);
}
}
return 0;
}
7、测试:遍历
/* 测试:遍历 */
int SearchAllStack(STACK_LIST *plist)
{
STACK_NODE *ptmp = plist->ptop;
if (NULL == plist->ptop)
{
printf("NO DATA!\n");
return -1;
}
else
{
while (ptmp != NULL)
{
printf("%d\n", ptmp->data);
ptmp = ptmp->pnext;
}
}
return 0;
}
总程序:
头文件
#ifndef _HEAD_H
#define _HEAD_H
#include <stdio.h>
#include <stdlib.h>
typedef int DATA_TYPE;
typedef struct node
{
DATA_TYPE data;
struct node *pnext;
}STACK_NODE;
typedef struct list
{
STACK_NODE *ptop;
int clen;
}STACK_LIST;
extern STACK_LIST *CreateStackList();
extern int JoinStrackNode(STACK_LIST *plist, DATA_TYPE data);
extern int LeaveStackNode(STACK_LIST *plist_in, STACK_LIST *plist_out);
extern int SearchAllStack(STACK_LIST *plist);
extern STACK_NODE *GetStackTop(STACK_LIST *plist);
extern int DeleteStackAll(STACK_LIST *plist);
extern int DestroyStack(STACK_LIST *plist);
#endif
main.c
#include "head.h"
int main(void)
{
int ret = 0;
/* 创建入栈列表 */
STACK_LIST *plist_in = CreateStackList();
if (NULL == plist_in)
{
perror("fail to create plist_in");
return -1;
}
/* 创建出栈列表 */
STACK_LIST *plist_out = CreateStackList();
if (NULL == plist_out)
{
perror("fail to create plist_out");
return -1;
}
/* 入栈 */
JoinStrackNode(plist_in, 1);
JoinStrackNode(plist_in, 2);
JoinStrackNode(plist_in, 3);
JoinStrackNode(plist_in, 4);
JoinStrackNode(plist_in, 5);
SearchAllStack(plist_in);
printf("========================\n");
/* 出栈 */
LeaveStackNode(plist_in, plist_out);
LeaveStackNode(plist_in, plist_out);
LeaveStackNode(plist_in, plist_out);
printf("plist_in:\n");
SearchAllStack(plist_in);
printf("========================\n");
printf("plist_out:\n");
SearchAllStack(plist_out);
/* 获取栈顶元素 */
STACK_NODE *top = GetStackTop(plist_in);
if (NULL == top)
{
perror("fail to GetStackTop");
}
printf("top data:%d\naddr:%p\n", top->data, top);
printf("========================\n");
/* 清空栈 */
DeleteStackAll(plist_in);
SearchAllStack(plist_in);
/* 销毁栈 */
DestroyStack(plist_in);
DestroyStack(plist_out);
return 0;
}
功能函数
#include "head.h"
/* 创建栈 */
STACK_LIST *CreateStackList()
{
STACK_LIST *plist = malloc(sizeof(STACK_LIST));
if (NULL == plist)
{
perror("fail to malloc list");
return NULL;
}
plist->ptop = NULL;
plist->clen = 0;
return plist;
}
/* 入栈 */
int JoinStrackNode(STACK_LIST *plist, DATA_TYPE data)
{
STACK_NODE *pnode = malloc(sizeof(STACK_NODE));
if (NULL == pnode)
{
perror("fail to malloc pnode");
return -1;
}
pnode->data = data;
pnode->pnext = NULL;
pnode->pnext = plist->ptop;
plist->ptop = pnode;
plist->clen++;
return 0;
}
/* 出栈 */
int LeaveStackNode(STACK_LIST *plist_in, STACK_LIST *plist_out)
{
STACK_NODE *pfree = NULL;
if (NULL == plist_in->ptop)
{
return -1;
}
else
{
pfree = plist_in->ptop;
plist_in->ptop = plist_in->ptop->pnext;
pfree->pnext = NULL;
plist_in->clen--;
}
f (NULL == plist_out->ptop)
{
plist_out->ptop = pfree;
}
else
{
pfree->pnext = plist_out->ptop;
plist_out->ptop = pfree;
plist_out->clen++;
}
return 0;
}
/* 获取栈顶元素 */
STACK_NODE *GetStackTop(STACK_LIST *plist)
{
if (NULL == plist->ptop)
{
return NULL;
}
else
{
return plist->ptop;
}
}
/* 清空栈 */
int DeleteStackAll(STACK_LIST *plist)
{
STACK_NODE *ptmp = plist->ptop;
STACK_NODE *pfree = NULL;
if (NULL == plist->ptop)
{
return -1;
}
while (ptmp != NULL)
{
pfree = ptmp;
ptmp = ptmp->pnext;
plist->ptop = ptmp;
free(pfree);
}
return 1;
}
/* 销毁栈 */
int DestroyStack(STACK_LIST *plist)
{
int ret = 0;
if (NULL == plist->ptop)
{
free(plist);
}
else
{
ret = DeleteStackAll(plist);
if (1 == ret)
{
free(plist);
}
}
return 0;
}
/* 测试:遍历 */
int SearchAllStack(STACK_LIST *plist)
{
STACK_NODE *ptmp = plist->ptop;
if (NULL == plist->ptop)
{
printf("NO DATA!\n");
return -1;
}
else
{
while (ptmp != NULL)
{
printf("%d\n", ptmp->data);
ptmp = ptmp->pnext;
}
}
return 0;
}
三、队列:FIFO
概念
允许从一端进行数据插入,而另一端进行数据删除的线性表
特性
先进先出、后进后出
应用场景:缓冲区(数据缓存)
为了解决高速设备和低速设备交互时速度不匹配问题,进行缓存(缓冲)
队列的基本操作:
1、创建队列
/* 创建队列 */
QUEUE_LIST *CreateQueueList()
{
QUEUE_LIST *plist = malloc(sizeof(QUEUE_LIST));
if (NULL == plist)
{
perror("fail to malloc list");
return NULL;
}
plist->pbegin = NULL;
plist->pend = NULL;
plist->clen = 0;
return plist;
}
2、创建队列元素
QUEUE_NODE *CreateQueueNode(DATA_TYPE data)
{
QUEUE_NODE *pnode = malloc(sizeof(QUEUE_NODE));
if (NULL == pnode)
{
perror("fail to malloc node");
return NULL;
}
pnode->data = data;
pnode->pnext = NULL;
return pnode;
}
3、入队操作
/* 入队 */
int JoinQueueNode(QUEUE_LIST *plist, QUEUE_NODE *pnode)
{
QUEUE_NODE *ptmp = NULL;
if (NULL == plist->pbegin)
{
plist->pbegin = pnode;
plist->pend = pnode;
plist->clen++;
}
else
{
ptmp = plist->pend;
ptmp->pnext = pnode;
plist->pend = pnode;
plist->clen++;
}
return 0;
}
4、出队操作
/* 出队 */
int LeaveQueueNode(QUEUE_LIST *plist)
{
QUEUE_NODE *ptmp = NULL;
if (plist->pbegin == NULL)
{
printf("NO NODE TO LEAVE\n");
return -1;
}
else if (plist->pbegin == plist->pend && plist->pbegin != NULL)
{
free(plist->pbegin);
plist->clen--;
plist->pbegin = NULL;
plist->pend = NULL;
}
else
{
ptmp = plist->pbegin;
while (ptmp->pnext->pnext != NULL)
{
ptmp = ptmp->pnext;
}
free(ptmp->pnext);
ptmp->pnext = NULL;
plist->pend = ptmp;
plist->clen--;
}
return 0;
}
5、清空队列
/* 清空队列 */
int DeleteQueueAll(QUEUE_LIST *plist)
{
QUEUE_NODE *ptmp = plist->pbegin;
QUEUE_NODE *pfree = NULL;
if (NULL == plist->pbegin && plist->pend == NULL)
{
return -1;
}
while (ptmp != NULL)
{
pfree = ptmp;
ptmp = ptmp->pnext;
plist->pbegin = ptmp;
free(pfree);
plist->clen--;
}
plist->pend = NULL;
return 0;
}
6、获取队列队头的数据
/* 获取队头数据 */
QUEUE_NODE *GetQueueBegin(QUEUE_LIST *plist)
{
if (NULL == plist->pbegin && NULL == plist->pend)
{
return NULL;
}
else
{
return plist->pbegin;
}
}
7、销毁队列
/* 销毁队列 */
int DestroyQueue(QUEUE_LIST *plist)
{
int ret = 0;
if (NULL == plist->pbegin && plist->pend == NULL)
{
free(plist);
}
else
{
ret = DeleteQueueAll(plist);
if (0 == ret)
{
free(plist);
}
}
return 0;
}
8、测试:遍历
/* 测试:遍历 */
int SearchAllQueue(QUEUE_LIST *plist)
{
QUEUE_NODE *ptmp = plist->pbegin;
if (NULL == plist->pbegin && NULL == plist->pend)
{
printf("NO DATA!\n");
return -1;
}
else
{
while (ptmp != NULL)
{
printf("%d\n", ptmp->data);
ptmp = ptmp->pnext;
}
}
printf("len = %d\n", plist->clen);
return 0;
}
总程序
头文件:
#ifndef _HEAD_H
#define _HEAD_H
#include <stdio.h>
#include <stdlib.h>
typedef int DATA_TYPE;
typedef struct node
{
DATA_TYPE data;
struct node *pnext;
}QUEUE_NODE;
typedef struct list
{
QUEUE_NODE *pbegin;
QUEUE_NODE *pend;
int clen;
}QUEUE_LIST;
extern QUEUE_LIST *CreateQueueList();
extern QUEUE_NODE *CreateQueueNode(DATA_TYPE data);
extern QUEUE_NODE *GetQueueBegin(QUEUE_LIST *plist);
extern int JoinQueueNode(QUEUE_LIST *plist, QUEUE_NODE *pnode);
extern int LeaveQueueNode(QUEUE_LIST *plist);
extern int SearchAllQueue(QUEUE_LIST *plist);
extern int DeleteQueueAll(QUEUE_LIST *plist);
extern int DestroyQueue(QUEUE_LIST *plist);
#endif
功能函数:
#include "head.h"
/* 创建队列 */
QUEUE_LIST *CreateQueueList()
{
QUEUE_LIST *plist = malloc(sizeof(QUEUE_LIST));
if (NULL == plist)
{
perror("fail to malloc list");
return NULL;
}
plist->pbegin = NULL;
plist->pend = NULL;
plist->clen = 0;
return plist;
}
QUEUE_NODE *CreateQueueNode(DATA_TYPE data)
{
QUEUE_NODE *pnode = malloc(sizeof(QUEUE_NODE));
if (NULL == pnode)
{
perror("fail to malloc node");
return NULL;
}
pnode->data = data;
pnode->pnext = NULL;
return pnode;
}
/* 入队 */
int JoinQueueNode(QUEUE_LIST *plist, QUEUE_NODE *pnode)
{
QUEUE_NODE *ptmp = NULL;
if (NULL == plist->pbegin)
{
plist->pbegin = pnode;
plist->pend = pnode;
plist->clen++;
}
else
{
ptmp = plist->pend;
ptmp->pnext = pnode;
plist->pend = pnode;
plist->clen++;
}
return 0;
}
/* 出队 */
int LeaveQueueNode(QUEUE_LIST *plist)
{
QUEUE_NODE *ptmp = NULL;
if (plist->pbegin == NULL)
{
printf("NO NODE TO LEAVE\n");
return -1;
}
else if (plist->pbegin == plist->pend && plist->pbegin != NULL)
{
free(plist->pbegin);
plist->clen--;
plist->pbegin = NULL;
plist->pend = NULL;
}
else
{
ptmp = plist->pbegin;
while (ptmp->pnext->pnext != NULL)
{
ptmp = ptmp->pnext;
}
free(ptmp->pnext);
ptmp->pnext = NULL;
plist->pend = ptmp;
plist->clen--;
}
return 0;
}
/* 清空队列 */
int DeleteQueueAll(QUEUE_LIST *plist)
{
QUEUE_NODE *ptmp = plist->pbegin;
QUEUE_NODE *pfree = NULL;
if (NULL == plist->pbegin && plist->pend == NULL)
{
return -1;
}
while (ptmp != NULL)
{
pfree = ptmp;
ptmp = ptmp->pnext;
plist->pbegin = ptmp;
free(pfree);
plist->clen--;
}
plist->pend = NULL;
return 0;
}
/* 获取队头数据 */
QUEUE_NODE *GetQueueBegin(QUEUE_LIST *plist)
{
if (NULL == plist->pbegin && NULL == plist->pend)
{
return NULL;
}
else
{
return plist->pbegin;
}
}
/* 销毁队列 */
int DestroyQueue(QUEUE_LIST *plist)
{
int ret = 0;
if (NULL == plist->pbegin && plist->pend == NULL)
{
free(plist);
}
else
{
ret = DeleteQueueAll(plist);
if (0 == ret)
{
free(plist);
}
}
return 0;
}
/* 测试:遍历 */
int SearchAllQueue(QUEUE_LIST *plist)
{
QUEUE_NODE *ptmp = plist->pbegin;
if (NULL == plist->pbegin && NULL == plist->pend)
{
printf("NO DATA!\n");
return -1;
}
else
{
while (ptmp != NULL)
{
printf("%d\n", ptmp->data);
ptmp = ptmp->pnext;
}
}
printf("len = %d\n", plist->clen);
return 0;
}
主函数:
#include "head.h"
int main(void)
{
/* 创建队列标签 */
QUEUE_LIST *plist = CreateQueueList();
if (NULL == plist)
{
perror("fail to create list");
return -1;
}
/* 入队 */
/* 创建队列结点 */
QUEUE_NODE *pnode = CreateQueueNode(1);
if (NULL == pnode)
{
perror("fail to create node");
return -1;
}
JoinQueueNode(plist, pnode);
pnode = CreateQueueNode(2);
if (NULL == pnode)
{
perror("fail to create node");
return -1;
}
JoinQueueNode(plist, pnode);
pnode = CreateQueueNode(3);
if (NULL == pnode)
{
perror("fail to create node");
return -1;
}
JoinQueueNode(plist, pnode);
pnode = CreateQueueNode(4);
if (NULL == pnode)
{
perror("fail to create node");
return -1;
}
JoinQueueNode(plist, pnode);
pnode = CreateQueueNode(5);
if (NULL == pnode)
{
perror("fail to create node");
return -1;
}
JoinQueueNode(plist, pnode);
SearchAllQueue(plist);
printf("=========================\n");
/* 获取队头数据 */
pnode = GetQueueBegin(plist);
if (NULL == pnode)
{
perror("this queue no begin\n");
}
else
{
printf("head data:%d\nhead addr:%p\n", pnode->data, pnode);
printf("=========================\n");
}
#if 0
/* 出队一次一个结点 */
LeaveQueueNode(plist);
LeaveQueueNode(plist);
SearchAllQueue(plist);
printf("=========================\n");
#endif
#if 1
/* 清空队列 */
DeleteQueueAll(plist);
SearchAllQueue(plist);
printf("=========================\n");
#endif
/* 销毁队列 */
DestroyQueue(plist);
return 0;
}