棧
棧是限制在一端進行插入和刪除操作的線性表(俗稱堆棧),允許進行操作的一端稱爲“棧頂”,另一固定端稱爲“棧底”,當棧中沒有元素時稱爲“空棧”。特點:先進後出(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)
隊列的特徵:
-
數據:
對於非空的隊列,表頭沒有直接前驅,表尾沒有直接後繼,其他有且僅有一個直接前驅和一個直接後繼。
-
操作
只允許在表尾插入數據,在表頭刪除數據。
規定:
front:始終存放在表頭前一個位置的下標
rear:始終存放隊尾的下標
C語言中:
結構體——封裝數據
函數——封裝代碼
隊列的順序存儲
typedef int data_t; //定義隊列中數據元素的數據類型
#define MAXSIZE 64 //定義隊列的容量
typedef struct
{
data_t data[MAXSIZE]; //用數組作爲隊列的儲存空間
int front, rear; //指示隊頭前一個位置和隊尾位置的指針
}sequeue; //順序隊列類型定義
sequeue *sq; //定義指向順序隊列的指針
順序隊列基本算法分析
-
初始化
-
申請順序隊列的空間
-
初始化隊頭和隊尾指針
front = rear = -1;
-
-
插入
-
刪除
-
是否空
-
是否滿