形如
a1,a2,a3…an
的表,這個表的大小為
n,而大小為
0的表稱為空表,非空表中,
ai+1
後繼ai
,ai-1
前驅ai
,表adt
的相關操有
printlist
列印表中的元素;
createempty
建立乙個空表;
find
返回關鍵字首次出現的位置;
insert
和delete
從表的某個位置插入和刪除某個關鍵字。
對錶的所有操作都可以通過使用陣列來實現,但在這裡使用鍊錶的方式來實現。鍊錶(
linked list
)由一系列不必在記憶體中相連的結構組成,每個結構均含有元素和指向包含該元素後繼元的結構的指標。鍊錶的結構有很多種,單向鍊錶、雙向鍊錶、迴圈鍊錶、有無表頭的鍊錶,這裡以有表頭結點的單向鍊錶為例,其餘幾種的實現思路相同。
首先定義鍊錶的結構:
struct node
;
表adt
的主要操作:
node *createempty()
void printlist(node *list)
}node *find(node *list, elementtype x)
return p;
}void insert(node *list, elementtype x)
p->next = new node;
p = p->next;
p->next = null;
p->element = x;
}void delete(node *list, elementtype x)
p->next = d->next;
delete d;
}
以上是基本的幾個操作,可以看到,操作中沒有對鍊錶是否為空進行檢測,在刪除操作中存在隱患。
棧(stack)是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。對棧的基本操作有push(進棧)和pop(出棧),前者相當於插入,後者相當於刪除最後插入的元素。
棧的實現可以是指標,或者使用陣列,陣列的實現在筆者前面的已經介紹過了,今次使用單鏈表的方式實現。
首先,棧的結構定義:
struct stack
;
棧adt
的主要操作:
stack *createstack()
void push(stack *s, elementtype x)
elementtype pop(stack *s)
return s->element;
}
像棧一樣,佇列也是一種表,然而,使用佇列時插入在一端進行而刪除則在另一端進行。佇列的基本操作時
enqueue
(入隊)和
dequeue
(出隊),入隊是指在表的末端
rear
插入乙個元素,而出隊是刪除(或者返回)在表的開頭
front
的元素。
如同棧的情形一樣,棧的實現可以用指標和陣列的方式,陣列的方式筆者同樣在之前做過介紹,今次使用單鏈表的方式實現。
首先,定義佇列的結構:
struct queue
;
佇列adt
的主要操作:
queue *createqueue()
void enqueue(queue *rear, elementtype x)
elementtype dequeue(queue *front)
表,棧和佇列
對錶的所有操作都可以使用陣列來實現。雖然陣列是靜態分配的,但是內部儲存陣列的ve ctor 類允許在需要時的時候將陣列的大小增加一倍。這解決了使用陣列是需要對錶的大小的最大值進行估計的問題。陣列實現使得pr intl ist 以線性時間執行,而fi ndkt h 則花費常數時間。然而,插入和刪除的花...
表 棧和佇列
表 棧和佇列是最簡單和最基本的三種資料結構 資料結構與演算法分析 c 語言描述 應用範疇 i.多項式 adt i.基數排序 多趟桶式排序 實現 i.多重表 鍊錶的游標實現 實現 棧又叫做 lifo 後進先出 表 資料結構與演算法分析 c 語言描述 應用範疇 i.平衡符號 i.字尾表示式 有中綴表示式...
鍊錶,棧和佇列
1.建立鍊錶 package com.zzw.鍊錶 非常基本的單項鍊表 author john public class node 新增乙個結點 node end new node d node n this while n.next null n.next end 刪除單向鍊錶中的結點 node ...