嵌入式day17

折月煮酒 提交于 2019-11-27 22:02:31

栈是限制在一端进行插入和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。特点:先进后出(LIFO)。

基本运算:

  • 创建空栈:CreateStack(len)

  • 清空栈:ClearStack(S)

  • 判断是否栈空:EmptyStack(S)

  • 判断是否栈满:FullStack(S)

  • 元素进栈:PushStack(S)

  • 元素出栈:PopStack(S)

  • 取栈顶元素:GetTop(S)

**顺序栈:**它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。

typedef int data_t;     //定义栈中数据元素的数据类型
typedef struct
{
 data_t *data;    //用指针指向栈的存储空间
 int maxlen;      //当前栈的最大元素个数
 int top;      //指示栈顶位置(数组下标)的变量
}seqstack_t;               //顺序栈类型定义

创建栈

seqstack_t *CreateStack(int len)
{
 seqstack_t *ss;
 ss = (seqstack_t *)malloc(sizeof(seqstack_t));
 ss->data = (data_t *)maloc(sizeof(data_t) *len)
 ss->top = -1;
 ss->maxlen = len;
 return ss;
}

清空栈

ClearStack(seqstack_t *S)
{
 S->top = -1
}

判断栈是否空

int EmptyStack(seqstack_t *S)
{
 return (S->top == -1 ? 1:0);
}

进栈

void PushStack(seqstack_t *S, data_t x)
{
 if(S->top == NULL){
 printf("overflow!\n");
 return;
 }
 else{
 S->top++;
 S->data[S->top] = x;
 }
 return ;
}

链式栈

插入操作和删除操作均在链表头部进行,链表未卜就是栈底,栈顶指针就是头指针。

typedef int data_t;                               //定义栈中数据元素的数据类型
typedef struct node_t
{
 data_t data;                                       //数据域
 struct node_t *next;                      //链接指针域
}linkstack_t;                                         //链栈类型定义

创建空栈

linkstack_t *CreateLinkstack()
{
 linkstack_t *top;
 top = (linkstack_t *)malloc(sizeof(linkstack_t));
 top->next = NULL;
 return top;
}

判断是否是空栈

int EmptyStack(linkstack_t *top)
{
 return (top->next == NULL ? 1:0)
}

入栈

void PushStack(linkstack_t *top, data_t x)
{
 linkstack_t *p;            //定义辅助指针
 p = (linkstack_t *)malloc(sizeof(linkstack_t));            //指向新结点
 p->data = x;                                       //将数据存入新结点的数据域中
 p->next = top->next;
 top->next = p;       //新结点插入原栈顶之前
 reurn;
}

队列概念及特征

队列概念:队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空对”。

特点:先进先出(FIFO)

队列的特征:

  1. 数据:

    对于非空的队列,表头没有直接前驱,表尾没有直接后继,其他有且仅有一个直接前驱和一个直接后继。

  2. 操作

    只允许在表尾插入数据,在表头删除数据。

规定:

front:始终存放在表头前一个位置的下标

rear:始终存放队尾的下标

C语言中:

结构体——封装数据

函数——封装代码

队列的顺序存储

typedef int data_t;             //定义队列中数据元素的数据类型
#define MAXSIZE 64          //定义队列的容量
typedef struct
{
 data_t data[MAXSIZE];   //用数组作为队列的储存空间
 int front, rear;                  //指示队头前一个位置和队尾位置的指针
}sequeue;                              //顺序队列类型定义
sequeue *sq;                      //定义指向顺序队列的指针

顺序队列基本算法分析

  • 初始化

    1. 申请顺序队列的空间

    2. 初始化队头和队尾指针front = rear = -1;

  • 插入

  • 删除

  • 是否空

  • 是否满

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!