表 棧和佇列

2021-07-24 23:59:54 字數 1950 閱讀 3156

形如

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 ...