嵌入式day17

棧是限制在一端進行插入和刪除操作的線性表(俗稱堆棧),允許進行操作的一端稱爲“棧頂”,另一固定端稱爲“棧底”,當棧中沒有元素時稱爲“空棧”。特點:先進後出(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;

  • 插入

  • 刪除

  • 是否空

  • 是否滿

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章