資料結構與演算法分析之表 棧和佇列(一)

2021-09-26 12:41:29 字數 3041 閱讀 5819

1.前驅元,後繼元

對於除空表外的任何表,我們說

adt  (abstract data type )抽象資料型別

2.鍊錶概念

鍊錶由一系列不必在記憶體中相連的結構組成。每乙個結構均含有表元素和指向包含該元素後繼元的結構的指標。我們稱之為next 指標。最後乙個單元的next指標指向null;該值由c定義並且不能與其他指標混淆。ansic規定null為零。

3.鍊錶的訪問

指標指向鍊錶的第乙個單元。第乙個單元包含乙個next指標,指向了第二個單元的位置,以此類推。所以訪問鍊錶,我們需要知道第乙個單元的位址。

4.鍊錶的刪除、插入

通過修改指標指向的位置即可刪除鍊錶中的元素。

插入命令需要使用一次malloc呼叫從系統得到乙個新單元(後面將詳細論述)並在此後執行兩次指標調整。其一般想法在圖中給出,其中的虛線表示原來的指標。

5.測試鍊錶是否是空表,測試當前位置是否是鍊錶末尾

l和p不一樣嗎?(p是指標。l是乙個指向煉表頭節點的指標。(鍊錶每個節點分為資料域和指標域,單鏈表的指標域只有後繼指標域,雙鏈表的指標域分為前趨指標域和後繼指標域));

6.鍊錶的刪除操作

將鍊錶的頭結點的next值賦值給p你真。將頭結點的指標賦值null。使用p指標判斷,當p指標不為null就將新的鍊錶賦值給乙個新的指標。最後返回新鍊錶的位址。 因為之前已經將l->next 賦值為null。 所以p指標判斷的時候自然會跳過這個節點,遍歷整個鍊錶後組成新的鍊錶。(資料結構與演算法分析(c語言版)p38)

在網上看到的另一種刪除元素的方法。其實就是將要刪除的節點與下乙個節點的關係變成將要刪除節點的下乙個元素和下下乙個元素的關係。(這麼理解可能不怎麼恰當)這樣p指標就不會指向原來的要刪除的元素了。具體看**(建議畫圖分析)

實際上就是一步,p->next = p->next->next. 用p來取代p->next;

#include #define error 0

#define ok 1

status listdelete(linklist *l,int i ,elemtype *e)

if(!(p->next) || j>i)

return error;

q = p->next;

p->next = q->next;

*e = q->data;

free(q);

return ok;

}

最後將q結點中的資料賦值給e,作為返回,並且釋放q節點。

7.鍊錶的插入

乙個節點分為資料域和指標域。所以插入操作其實就是在要插入的位置生成一塊記憶體空間,存放即將插入的節點。新生成節點s,將其指標域指向要插入位置的資料域部分。將要插入位置的前乙個元素的指標域指向s的資料域部分。

/*初始條件:順序線性表l已存在,1≤i≤listlength(l)*/

/*操作結果:在l中第i個位置之前插入新的資料元素e,l的長度加1*/

status listinsert(linklist *l,int i ,elemtype e)

if (!p || j >i)

return error; /*第i個元素不存在*/

s = (linklist)malloc(sizeof(node)); /*生成新的結點*/

s->data = e;

s->next = p->next; /*將p的後繼結點賦值給s的後繼*/

p->next = s; /*將s賦值給p的後繼*/

return ok;

}

8.malloc宣告指向乙個結構的指標並不建立該結構,而只是給出足夠的空間容納結構可能會使用的位址。建立尚未被宣告過的記錄的惟一方法是使用malloc庫函式。malloc(howmanybytes)使系統建立乙個新的結構並返回指向該結構的指標。

9.基數排序

原理:準備10個容器,編號0-9,對應數字0-9。 容器是有序的(按新增順序)

然後按待排序元素的某一位的數字(比如:個位/十位/白位)將其存放到對應容器中(數字相同,如: 個位是數字1時, 就把這個元素放在1號桶),所有元素這樣處理完後,

再從0號容器開始依次到9號容器, 將其中的元素順序取出。所以容器內的元素收集合併複製回原陣列,然後再從下一位開始…(比如個位處理完後, 再處理十位/百位....最高位)

這裡假設陣列元素都是3位數。從個位開始,將陣列中的元素按個位數字放入對應的桶中,再從桶中順序取出到陣列,這是陣列按個位數字有序排列,再以相同的邏輯處理十位和百位。最後陣列中就是有序的了

這裡的排序原理是:將元素按位排序, 但是優先順序不同,  做高位優先順序高, 然後是次高位...。這樣考慮:一組元素按最高位排序,那麼在不考慮其他位的情況下,這組元素是有序的。再考慮低位,當個位排序好後,在排序十位,這時對十位的排序影響個位了嗎?並沒有。這就是優先順序(權重)的問題, 十位對數字大小的影響顯然比個位高。

本文參考《資料結構與演算法分析-c語言版》

資料結構與演算法分析之表 棧和佇列 二

1.棧的概念 棧 stack 是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,叫做棧的頂 top 對棧的基本操作有push 進棧 和pop 出棧 前者相當於插入,後者則是刪除最後插入的元素。棧有時叫做後進先出 lifo last in first out 表。2.elementtype ...

資料結構與演算法之棧和佇列

棧和佇列以及優先佇列是比陣列和其他資料結構更加抽象的結構。主要通過介面對棧 佇列 和優先順序佇列進行定義,這些介面表明通過它們可以完成的操作,而它們的主要實現機制對 使用者來說是不可見的。棧每一次只允許訪問乙個資料項 最後插入的資料項,所以棧又叫先進後出 在這裡用陣列定義乙個棧,如下 public ...

資料結構與演算法之棧和佇列

1.棧 package com.thinkofdatastruct.fourunit public class stackdemo 帶引數的構造方法 public stackdemo int maxsize 加入資料 public void push int data pop移除資料 public ...