數組a5是哪種存儲結構
❶ 關於數組的存儲位置
A[1,1,1]轉換成以0為基準的數組應該是a[2,1,4],第一維長度為5,第二維長度7,第三維長度為6,則A[1,1,1]應該是該數組的第2*5*7+2*5+7+4=91個元素,每個元素長度是5,則第91個元素的存儲位置為2000+(91-1)*5=2450
❷ 一個簡單的問題,數組是邏輯結構還是存儲結構
存儲結構是邏輯結構的存儲映像,邏輯結構指的是數據間的關系,它又分為線性結構和非線性結構,這兩者並不沖突。一個指的是數據之間的關系,而另一個指這種關系在計算機中的表現形式。兩者的區別就在於給他們定義的特殊操作,它們都有」出「和」入「兩種操作,一個是「先進先出」,而一個是「後進先出」。
一種邏輯結構在計算機里可以用不同的存儲結構實現。比如邏輯結構中簡單的線性結構,可以用數組(順序存儲)或單向鏈表(鏈接存儲)來實現。邏輯結構:指各數據元素之間的邏輯關系。存儲結構:就是數據的邏輯結構用計算機語言的實現。
❸ 數組的存儲結構採用什麼存儲方式
順序存儲方式。
數組就是在內存中開辟一塊連續的、大小相同的空間,用來存儲數據。
連續:內存地址是連續的。如a是首地址,a+1就是第二個數據元素的地址,a+2是第三個。
大小相同:指每個數組元素所佔的空間大小是相同的。((a+i)-(a+i-1)=定值 是多少?)
如: int a[]={1,2,3,4};
示例:
a a+1 a+2 a+3
1 2 3 4
a[0] a[1] a[2] a[3]
注意:數組名不能被賦值,因為它是個常量值。代表數組的首地址。
❹ 數組是按照什麼數據結構存儲的
順序存儲結構,因為數組在空間上是連續的
❺ 存儲結構有哪幾種
存儲結構有:
1、鏈接存儲:在計算機中用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。
例:鏈。
2、順序存儲:在計算機中用一組地址連續的存儲單元依次存儲線性表的各個數據元素,稱作線性表的順序存儲結構。
例:數組,鏈。
3、索引存儲:除建立存儲結點信息外,還建立附加的索引表來標識結點的地址,索引表由若干索引項組成。
例:線索樹。
4、散列存儲:散列存儲,又稱hash存儲,是一種力圖將數據元素的存儲位置與關鍵碼之間建立確定對應關系的查找技術。
例:棧(既可以通過順序存儲也可以同通過隨機存儲)。
順序存儲和鏈接存儲的基本原理:
在順序存儲中,每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過數組下標位置簡單計算出來的線性表的順序存儲,若一個元素存儲在對應數組中的下標位置為i,則它的前驅元素在對應數組中的下標位置為i-1,它的後繼元素在對應數組中的下標位置為i+1。
在鏈式存儲結構中,存儲結點不僅含有所存元素本身的信息,而且含有元素之間邏輯關系的信息。
在數據的順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同。
而在數據的鏈接存儲中,由於每個元素的存儲位置保存在它的前驅或後繼結點中,所以只有當訪問到其前驅結點或後繼結點後才能夠按指針訪問到,訪問任一元素的時間與該元素結點在鏈式存儲結構中的位置有關。
❻ 數據結構與演算法-隊列
同樣是線性表,隊列也有類似線性表的各種操作,不同的就是插入數據只能在隊尾進行,刪除數據只能在隊頭進行。
線性表有順序存儲和鏈式存儲,棧是線性表,所以有這兩種存儲方式。同樣,隊列作為一種特殊的線性表,也同樣存在這兩種存儲方式。
我們假設一個隊列有n個元素,則順序存儲的隊列需建立一個大於n的數組,並把隊列的所有元素存儲在數組的前n個單元,數組下標為0的一端即是隊頭。所謂的入隊列操作,其實就是在隊尾追加一個元素,不需要移動任何元素,因此時間復雜度為 。
與棧不同的是,隊列元素的出列是在隊頭,即下標為0的位置,那也就意味著,隊列中的所有元素都得向前移動,以保證隊列的隊頭,也就是下標為0的位置不為空,此時時間復雜度為 。
可有時想想,為什麼出隊列時一定要全部移動呢,如果不去限制隊列的元素必須存儲在數組的前n個單元這一條件,出隊的性能就會大大增加。也就是說,隊頭不需要一定在下標為0的位置,
為了避免當只有一個元素時,隊頭和隊尾重合使處理變得麻煩,所以引入兩個指針,front指針指向隊頭元素,rear指針指向隊尾元素的下一個位置,這樣當front等於rear時,此隊列不是還剩一個元素,而是空隊列。
假設是長度為5的數組,初始狀態,空隊列列如圖所示,front與rear指針均指向下標為0的位置。然後入隊a1、a2、a3、a4,front指針依然指向下標為0位置,而rear指針指向下標為4的位置。
出隊a1、a2,則front指針指向下標為2的位置,rear不變,如圖4-12-5的左圖所示,再入隊a5,此時front指針不變,rear指針移動到數組之外。嗯?數組之外,那將是哪裡?如下圖的右圖所示。
假設這個隊列的總個數不超過5個,但目前如果接著入隊的話,因數組末尾元素已經佔用,再向後加,就會產生數組越界的錯誤,可實際上,我們的隊列在下標為0和1的地方還是空閑的。我們把這種現象叫做「假溢出」。
所以解決假溢出的辦法就是後面滿了,就再從頭開始,也就是頭尾相接的循環。我們把隊列的這種頭尾相接的順序存儲結構稱為循環隊列。
如果將rear的指針指向下標為0的位置,那麼就不會出現指針指向不明的問題了,如下圖所示。
接著入隊a6,將它放置於下標為0處,rear指針指向下標為1處,如下圖的左圖所示。若再入隊a7,則rear指針就與front指針重合,同時指向下標為2的位置,如下圖的右圖所示。
由於rear可能比front大,也可能比front小,所以盡管它們只相差一個位置時就是滿的情況,但也可能是相差整整一圈。
所以若隊列的最大尺寸為QueueSize,那麼隊列滿的條件是(rear+1)%QueueSize==front(取模「%」的目的就是為了整合rear與front大小為一圈問題)。比如上面這個例子,QueueSize=5,上圖的左圖中front=0,而rear=4,(4+1)%5=0,所以此時隊列滿。
再比如圖下圖中的,front=2而rear=1。(1+1)%5=2,所以此時隊列也是滿的。
而對於下圖,front=2而rear=0,(0+1)%5=1,1≠2,所以此時隊列並沒有滿。
另外,當rear>front時,此時隊列的長度為rear-front。
但當rear<front時,,隊列長度分為兩段,一段是QueueSize-front,另一段是0+rear,加在一起,隊列長度為rear-front+QueueSize。因此通用的計算隊列滿隊公式為:
單是順序存儲,若不是循環隊列,演算法的時間性能是不高的,但循環隊列又面臨著數組可能會溢出的問題,所以我們還需要研究一下不需要擔心隊列長度的鏈式存儲結構。
隊列的鏈式存儲結構,其實就是線性表的單鏈表,只不過它只能尾進頭出而已,我們把它簡稱為鏈隊列。為了操作上的方便,我們將隊頭指針指向鏈隊列的頭結點,而隊尾指針指向終端結點。
空隊列時,front和rear都指向頭結點。
鏈隊列的結構為:
初始化一個空隊列
入隊操作時,其實就是在鏈表尾部插入結點,如圖所示。
出隊操作時,就是頭結點的後繼結點出隊,將頭結點的後繼改為它後面的結點,若鏈表除頭結點外只剩一個元素時,則需將rear指向頭結點,如圖所示。
對於循環隊列與鏈隊列的比較,可以從兩方面來考慮,從時間上,其實它們的基本操作都是常數時間,即都為O(1)的,不過循環隊列是事先申請好空間,使用期間不釋放,而對於鏈隊列,每次申請和釋放結點也會存在一些時間開銷,如果入隊出隊頻繁,則兩者還是有細微差異。對於空間上來說,循環隊列必須有一個固定的長度,所以就有了存儲元素個數和空間浪費的問題。而鏈隊列不存在這個問題,盡管它需要一個指針域,會產生一些空間上的開銷,但也可以接受。所以在空間上,鏈隊列更加靈活。
總的來說,在可以確定隊列長度最大值的情況下,建議用循環隊列,如果你無法預估隊列的長度時,則用鏈隊列。
棧和隊列也都可以通過鏈式存儲結構來實現,實現原則上與線性表基本相同如圖所示。