堆疊和佇列都是對線性表做一些特殊的限制,形成了兩種儲存資料的結構,乙個是先進後出、乙個是先進先出、可以解決實際生活中遇到的一些問題,資料庫也可以理解成一種資料結構,只不過這種結構比較普通罷了。
2.2.1 什麼是堆疊
先進後出,後進先出的線性表就是堆疊,相當於對線性表的操作做一些特殊的限制
堆疊:有一定操作限制的線性表,只在一端做插入、刪除。
資料物件集:乙個有0個或多個元素的有窮線性表
操作集:
stack createstack
(int maxsize)
;//生成空堆疊,長度為maxsize();
intisfull
(stack s,
int maxsize)
;//判斷堆疊s是否已滿。
void
push
(stack s, elementtype item)
;//把元素item壓入堆疊.
intisempty
(stack s)
;//判斷堆疊是否為空。
elementtype pop
(stack s)
;//刪除棧頂元素,並返回新的棧頂元素
2.2.2 堆疊的順序儲存
用陣列儲存,最後乙個元素的下標即為top,空棧時top為-1。
#define maxsize 《儲存資料元素的最大個數》
typedef
struct snode *stack;
struct snode
;
void
push
(stack s, elementtype x)
else
return
;}
elementtype pop
(stack s)
else
}
用乙個陣列儲存兩個堆疊,讓堆疊從兩邊向中間生長。
typedef
struct dsnode *dstack
struct dsnode
;
//tag用來區分這兩個堆疊,0表示第乙個,1表示第二個。
void push(dstack s, elementtype x, tag i)else
}
elementtype pop
(dstack s,
int tag)
else
return s->data[
(s->top1)--]
;}else
else
return s->data[
(s->top2)++]
;}}
2.2.3 堆疊的鏈式儲存
用單向鍊錶實現堆疊,只能在鏈頭操作(乙個鍊錶節點不知道它的上乙個節點在**)
typedef
struct snode *stack;
struct snode
;
//這個頭結點不代表任何元素,一直存在在堆疊頭,只是為了方便堆疊的插入刪除操作。
stack createstack()
//可以通過判斷頭結點的next是否為null來得知是否為空。
intisempty
(stack s)
void
push
(elementtype x, stack s)
stack pop
(stack s)
else
}
2.2.4 堆疊應用:表示式求值
中綴表示式轉換為字尾表示式:
運算數:直接輸出
左括號:壓棧
右括號:出棧,直到遇到左括號
運算子:遇到運算符號先入棧,直到遇到比棧頂符號優先順序低的,出棧,然後該符號再和下乙個棧頂元素比較,直到比棧頂高階或空棧。
字尾表示式求值:
運算數:入棧
運算子:彈出合適數量的運算數做計算
插入(入隊addq)和刪除(出隊deleteq)位於佇列兩頭。
型別名稱:佇列(queue)
資料物件集:乙個有0個或多個元素的有窮線性表。
操作集:
queue createqueue
(int maxsize)
;int
isfull
(queue q,
int maxsize)
;void
addq
(queue q, elementtype x)
;int
isempty
(queue q)
;elementtpye deleteq
(queue q)
;
佇列的順序儲存實現
#define maxsize《佇列的最大個數》
typedef
struct qnode *queue;
struct qnode
;
void
addq
(queue q, elementtype x)
q->rear =
(q->rear+1)
%maxsize;
q->data[q->rear]
= x;
}
elementtype deleteq
(queue q)
q->front =
(q->front+1)
%maxsize;
return q->data[q->front]
;}
佇列的鏈式儲存
front設在煉表頭,rear設在鍊錶尾
typedef
struct node *list
struct node
;struct qnode
;typedef
struct qnode *queue//乙個qnode型別的指標,不同的指標表示不同的佇列。
void
addq
(queue q, elementtype x)
q->rear->next = s;
q->rear = s;
return
;}
elementtype deleteq
(queue q)
//如果只有乙個元素,就把rear和front都置為null
if(q->rear == q->front)q->rear =
null
; list s = q->front;
elementtype x = s->data;
//如果只有乙個元素那麼s的next就是null,這裡使用小技巧同時涵蓋了乙個或多個元素的情況
q->front = s->next;
free
(s);
return x;
}
第二講 線性結構
1,順序儲存 線性表是零個或多個資料元素的有限序列,元素之間有順序,且第乙個元素無前驅,最後乙個元素沒有後繼,其它的元素都有乙個前驅乙個後繼,就是我們說的一對一。我們先來談一談順序儲存結構,順序儲存是通過一維陣列來實現的,且順序結構儲存需要三個屬性,儲存空間的起始位置,線性表的最大儲存容量,以及線性...
第二講線性結構
簡單來說像這樣的猶如一條線的結構就屬於線性結構常見有我們熟知的陣列還有單鏈表。在學資料結構之前我們對陣列就很了解了,最簡單的就是一維陣列,一維陣列也是最簡單的線性結構。優點 1.訪問方便,之間訪問下標對應元素即可 2.寫起來也方便用起來也方便看著也舒服 缺點 1.在中間位置插入元素時,其後所以元素都...
第二講 資料結構
include using namespace std const int n 100010 int e n ne n head 1,idx 向煉表頭插入乙個數x o 1 void add to head int x 在第k個插入的數後面插入乙個數x o 1 要用鍊錶那就是o n void add ...