❶ 順序表的靜態存儲與動態存儲有什麼區別
char
sz[5];就是靜態的
char
*psz
=
new
char[5]就是動態的
靜態的5一定要試常數不能使變數,而動態的則可以是隨便的,可以是表達式也可以是常量或變數
因為靜態的是編譯完就分配好的,而動態的是在運行過程中才確定大小的;
比如我在程序中寫char
sz[5];那麼運行過程中就無法改變這塊內存,分配大小從開始到運行結束都始終是不變的
而如果我在程序中寫
int
i;
cin
>>
i;
char
*psz
=
new
char[i];
程序開始是沒有分配大小的,因為這個值是未知的,等到我輸入數值,他才知道該分配了多大,而你不能這樣寫
int
i;
cin
>>
i;
char
sz[i];
這樣寫是錯誤的,他會警告中括弧裡面的數字不是常數
而像這樣的臨時分配的內存必須要釋放掉(c++中用delete而c中則是用free())
❷ 順序棧的靜態分配和動態分配有什麼區別,有什麼優劣
沒什麼絕對的優劣之分吧,主要還是看你的業務需要;
如果是業務是固定的范圍,那麼動態的似乎就沒必要,靜態的反而性能/穩定性/內存碎片都要好些;
如果業務彈性度很大,那麼就需要動態管理了,需要一定的伸縮度
❸ 順序棧和鏈棧各有哪些優缺點
順序棧和鏈棧區別如下:
1。存儲結構不同,順序棧是靜態分配的,而鏈棧則是動態分配的,鏈棧可以將很多零碎的空間利用起來,容量可變,節省空間,順序棧則固定內存空間,容量不變。
2。使用方面,順序棧查詢速度快,鏈棧添加刪除數據更快。
❹ 棧的存儲結構
棧同順序表和鏈表一樣,棧也是用來存儲邏輯關系為 "一對一" 數據的線性存儲結構。
棧的具體實現
棧是一種 "特殊" 的線性存儲結構,因此棧的具體實現有以下兩種方式:
順序棧:採用順序存儲結構可以模擬棧存儲數據的特點,從而實現棧存儲結構;
鏈棧:採用鏈式存儲結構實現棧結構;
棧存儲結構與之前所學的線性存儲結構有所差異,這緣於棧對數據 "存" 和 "取" 的過程有特殊的要求:
棧只能從表的一端存取數據,另一端是封閉的;
在棧中,無論是存數據還是取數據,都必須遵循"先進後出"的原則,即最先進棧的元素最後出棧。
通常,棧的開口端被稱為棧頂;相應地,封口端被稱為棧底。因此,棧頂元素指的就是距離棧頂最近的元素。
❺ 鏈棧和順序棧兩種存儲結構有什麼不同
存儲結構不同:
鏈棧動態分配內存存儲數據,不浪費內存,存儲的數據不連續。
順序棧使用固定大小數組保存數據,數據量小時浪費內存,過多時出問題,存儲數據連續。
它們的具體區別如下:
順序棧的實現在於使用了數組這個基本數據結構,數組中的元素在內存中的存儲位置是連續的,且編譯器要求我們在編譯期就要確定數組的大小,這樣對內存的使用效率並不高,一來無法避免因數組空間用光而引起的溢出問題。在系統將內存分配給數組後,則這些內存對於其他任務就不可用。而對於鏈棧而言,使用了鏈表來實現棧,鏈表中的元素存儲在不連續的地址,由於是動態申請內存,所以我們可以以非常小的內存空間開始,另外當某個項不使用時也可將內存返還給系統。
❻ 數據結構中什麼叫做順序棧
順序棧
棧的順序存儲結構簡稱為順序棧,它是運算受限的順序表。
1、
順序棧的類型定義
#define
StackSize
100
//假定預分配的棧空間最多為100個元素
typedef
char
DataType;//假定棧元素的數據類型為字元
typedef
struct{
DataType
data[StackSize];
int
top;
}SeqStack;
注意:
①順序棧中元素用向量存放
②棧底位置是固定不變的,可設置在向量兩端的任意一個端點
③棧頂位置是隨著進棧和退棧操作而變化的,用一個整型量top(通常稱top為棧頂指針)來指示當前棧頂位置
2、
順序棧的基本操作
前提條件:
設S是SeqStack類型的指針變數。若棧底位置在向量的低端,即S->data[0]是棧底元素。
(1)
進棧操作
進棧時,需要將S->top加1
注意:
①S->top==StackSize-1表示棧滿
②"
上溢
"現象--當棧滿時,再做進棧運算產生空間溢出的現象。
上溢是一種出錯狀態,應設法避免。
(2)
退棧操作
退棧時,需將S->top減1
注意:
①S->top<0表示空棧
②"
下溢
"現象——當棧空時,做退棧運算產生的溢出現象。
下溢是正常現象,常用作程序控制轉移的條件。
順序棧在進棧和退棧操作時的具體變化情況【參見動畫演示】
3、順序棧的基本運算
(1)
置棧空
void
InitStack(SeqStack
*S)
{//將順序棧置空
S->top=-1;
}
(2)
判棧空
int
StackEmpty(SeqStack
*S)
{
return
S->top==-1;
}
(3)
判棧滿
int
StackFull(SeqStack
*SS)
{
return
S->top==StackSize-1;
}
(4)
進棧
void
Push(S,x)
{
if
(StackFull(S))
Error("Stack
overflow");
//上溢,退出運行
S->data[++S->top]=x;//棧頂指針加1後將x入棧
}
(5)
退棧
DataType
Pop(S)
{
if(StackEmpty(S))
Error("Stack
underflow");
//下溢,退出運行
return
S->data[S->top--];//棧頂元素返回後將棧頂指針減1
}
(6)
取棧頂元素
DataType
StackTop(S)
{
if(StackEmpty(S))
Error("Stack
is
empty");
return
S->data[S->top];
}
4、兩個棧共享同一存儲空間
當程序中同時使用兩個棧時,可以將兩個棧的棧底設在向量空間的兩端,讓兩個棧各自向中間延伸。當一個棧里的元素較多,超過向量空間的一半時,只要另一個棧的元素不多,那麼前者就可以佔用後者的部分存儲空間。
只有當整個向量空間被兩個棧占滿(即兩個棧頂相遇)時,才會發生上溢。因此,兩個棧共享一個長度為m的向量空間和兩個棧分別佔用兩個長度為 └ m/2┘和┌m/2┐的向量空間比較,前者發生上溢的概率比後者要小得多。
❼ 採用順序存儲結構(用動態數組)或鏈式存儲結構,編寫主函數演示順序棧/鏈棧的基本操作
#include<iostream>
#include"stdlib.h"
usingnamespacestd;
#definestack_init_size100
#definestackincrement10
typedefintselemtype;
typedefintstatus;
typedefstruct{
selemtype*base;
selemtype*top;
intstacksize;
}sqstack;
statusinitstack(sqstack&s)
{
s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
if(!s.base)exit(0);
s.top=s.base;
s.stacksize=stack_init_size;
return1;
}
voidcreate_sqstack(sqstack&s)
{
inti,n;
cout<<"請輸入棧的長度:"<<endl;
cin>>n;
cout<<"請輸入棧中的元素:"<<endl;
for(i=0;i<n;i++){
cin>>s.top[i];}
s.top=s.base;
for(i=0;i<n;i++){
s.top=s.top+1;}
}
statuspush(sqstack&s,selemtypee)
{
if(s.top-s.base>=s.stacksize){
s.base=(selemtype*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(selemtype));
if(!s.base)exit(0);
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;}
*s.top++=e;
return1;
}
statuspop(sqstack&s,selemtype&e)
{
if(s.top==s.base)return0;
e=*--s.top;
return1;
}
statusstackempty(sqstacks)
{
if(s.top==s.base)
return0;
else
return1;
}
voidconversion(intn)
{
sqstacks;inte;
initstack(s);
while(n){
push(s,n%2);
n=n/2;}
cout<<"二進制數:"<<endl;
while(stackempty(s))
{pop(s,e);
cout<<e;}
cout<<endl;
}
voidmain()
{sqstacks;inti,e,*p,n;
initstack(s);
create_sqstack(s);
cout<<"插入元素為:"<<endl;
cin>>e;
push(s,e);
p=s.top;
s.top=s.base;
cout<<"插入元素後的棧為:"<<endl;
for(i=0;i<p-s.base;i++){
cout<<*s.top<<"";
s.top=s.top+1;}
cout<<endl;
pop(s,e);
p=s.top;
s.top=s.base;
cout<<"刪除的棧頂元素為:"<<endl<<e<<endl;
cout<<"刪除棧頂元素後的棧為:"<<endl;
for(i=0;i<p-s.base;i++){
cout<<*s.top<<"";
s.top=s.top+1;}
cout<<endl;
cout<<"十進制數:"<<endl;
cin>>n;
conversion(n);
system("pause");
}
上學期正好做過。。
❽ 設計一個動態數組存儲結構的順序棧類SeqStack,
思路很簡單,根放在0位置,以後假定當前位置是i,那麼左子結點在2i+1,右子結點在2i+2。比如根的左子結點在1,右子結點在2。結點1的左子結點在3,右子結點在4。定義一種空值表示沒有子結點,比如empty。
假定一個結點由3個成員組成:value, left, right
數組假定是全局的,如果不是可以作為參數傳送。
遞歸實現比較簡單:
void btree2array(node, index)
{
if(node == NULL)
array[index] = empty;
array[index] = node->value;
btree2array(node->left, index * 2 + 1);
btree2array(node->right, index * 2 + 2);
}
開始調用的時候就一句話:
btree2array(root, 0);
另外,虛機團上產品團購,超級便宜
❾ 棧是不是順序存儲的線性結構啊
不一定。
棧分順序棧和鏈式棧。順序棧為棧的順序實現,順序棧為利用順序存儲結構實現的棧。
採用地址連續的存儲空間(數組)依次存儲棧中數據元素,由於人棧和出棧運算都是在棧頂進行,而棧底位置是固定不變的,可以將棧底位置設置在數組空間的起始處;棧頂位置為隨入棧和出棧操作而變化的,故需用一個整型變數top來記錄當前棧頂元素在數組中的位置。
鏈式棧為一種數據存儲結構,可以通過單鏈表的方式來實現,使用鏈式棧的優點在於它能夠克服用數組實現的順序棧空間利用率不高的特點,但是需要為每個棧元素分配額外的指針空間用來存放指針域。
(9)順序棧存儲動態擴展閱讀
棧作為一種數據結構,為一種只能在一端進行插入和刪除操作的特殊線性表。它按照先進後出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指針。
在計算機系統中,棧為一個具有以上屬性的動態內存區域。程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在i386機器中,棧頂由稱為esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。
❿ 棧的順序存儲是什麼
由於棧是運算受限的線性表,因此線性表的存儲結構對棧也適用,而線性表有順序存儲和鏈式存儲兩種,所以棧也有順序存儲和鏈式存儲兩種。
1.棧的順序存儲棧的順序存儲是利用一組地址連續的存儲單元依次存放從棧底到棧頂的數據元素,並附設指針top指示棧頂。
2.棧的順序存儲類型定義1)用內存動態分配方式定義棧的順序存儲(1)棧的順序存儲表示。
順序棧本質上是順序表的簡化,由於棧底位置是固定不變的,所以可以將棧底位置設置在存儲空間的基地址上,棧頂位置是隨著進棧和退棧操作而變化的,故用top來指示當前棧頂元素的下一個位置,通常稱top為棧頂指針。