當前位置:首頁 » 服務存儲 » 動態存儲中棧的初始條件
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

動態存儲中棧的初始條件

發布時間: 2022-05-11 02:33:11

『壹』 數據結構里順序存儲和鏈式存儲判定棧空和棧滿的條件分別是什麼

順序
空 top=-1;
滿 top=maxsize-1
鏈式
空 top->next=null
動態分配空間,沒有滿

『貳』 請問一下c語言關於棧的基本應用

#include <stdlib.h>

010 #include <malloc.h>

011 #include <memory.h>

012 #include <assert.h>
/*------------------------------------------------------------

12 // 棧結構的定義

13 ------------------------------------------------------------*/

14 typedef struct Stack

15 {

16 ElemType *base; // 棧基址

17 ElemType *top; // 棧頂

18 int stacksize; // 棧存儲空間的尺寸

19 } SqStack;

20

21 /*------------------------------------------------------------

22 // 棧的基本操作

23 ------------------------------------------------------------*/

24

25 bool InitStack(SqStack *S);

26 void DestroyStack(SqStack *S);

27 bool StackEmpty(SqStack S);

28 int StackLength(SqStack S);

29 bool GetTop(SqStack S, ElemType *e);

30 void StackTraverse(SqStack S, void (*fp)(ElemType));

31 bool Push(SqStack *S, ElemType e);

32 bool Pop(SqStack *S, ElemType *e);

33 bool bracketMatch(SqStack *S,const char *arr);

const int STACK_INIT_SIZE = 100; // 初始分配的長度

016 const int STACKINCREMENT = 10; // 分配內存的增量

017

018 /*------------------------------------------------------------

019 操作目的: 初始化棧

020 初始條件: 無

021 操作結果: 構造一個空的棧

022 函數參數:

023 SqStack *S 待初始化的棧

024 返回值:

025 bool 操作是否成功

026 ------------------------------------------------------------*/

027 bool InitStack(SqStack *S)

028 {

029 S->base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType));

030 if(S ->base == NULL)

031 return false;

032 S ->top = S ->base;

033 S->stacksize = STACK_INIT_SIZE;

034 return true;

035 }

036

037 /*------------------------------------------------------------

038 操作目的: 銷毀棧

039 初始條件: 棧S已存在

040 操作結果: 銷毀棧S

041 函數參數:

042 SqStack *S 待銷毀的棧

043 返回值:

044 無

045 ------------------------------------------------------------*/

046 void DestroyStack(SqStack *S)

047 {

048 assert(S != NULL);

049 free(S ->base);

050 S->base = S->top = NULL;

051 }

052

053 /*------------------------------------------------------------

054 操作目的: 判斷棧是否為空

055 初始條件: 棧S已存在

056 操作結果: 若S為空棧,則返回true,否則返回false

057 函數參數:

058 SqStack S 待判斷的棧

059 返回值:

060 bool 是否為空

061 ------------------------------------------------------------*/

062 bool StackEmpty(SqStack S)

063 {

064 assert((S.base != NULL)&&(S.top != NULL));

065 return (S.base == S.top);

066 }

067

068 /*------------------------------------------------------------

069 操作目的: 得到棧的長度

070 初始條件: 棧S已存在

071 操作結果: 返回S中數據元素的個數

072 函數參數:

073 SqStack S 棧S

074 返回值:

075 int 數據元素的個數

076 ------------------------------------------------------------*/

077 int StackLength(SqStack S)

078 {

079 assert((S.base != NULL)&&(S.top != NULL));

080 return (S.top - S.base);

081 }

082

083 /*------------------------------------------------------------

084 操作目的: 得到棧頂元素

085 初始條件: 棧S已存在

086 操作結果: 用e返回棧頂元素

087 函數參數:

088 SqStack S 棧S

089 ElemType *e 棧頂元素的值

090 返回值:

091 bool 操作是否成功

092 ------------------------------------------------------------*/

093 bool GetTop(SqStack S, ElemType *e)

094 {

095 assert((S.base != NULL) && (S.top != NULL));

096 if(S.top == S.base)

097 exit(0);

098 *e = *(S.top - 1);

099 return true;

100 }

101

102 /*------------------------------------------------------------

103 操作目的: 遍歷棧

104 初始條件: 棧S已存在

105 操作結果: 依次對S的每個元素調用函數fp

106 函數參數:

107 SqStack S 棧S

108 void (*fp)() 訪問每個數據元素的函數指針

109 返回值:

110 無

111 ------------------------------------------------------------*/

112 void StackTraverse(SqStack S, void (*fp)(ElemType))

113 {

114 assert((S.base != NULL) && (S.top != NULL));

115 while(S.base < S.top)

116 {

117 (*fp)(*S.base);

118 S.base++;

119 }

120 }

121

122 /*------------------------------------------------------------

123 操作目的: 壓棧——插入元素e為新的棧頂元素

124 初始條件: 棧S已存在

125 操作結果: 插入數據元素e作為新的棧頂

126 函數參數:

127 SqStack *S 棧S

128 ElemType e 待插入的數據元素

129 返回值:

130 bool 操作是否成功

131 ------------------------------------------------------------*/

132 bool Push(SqStack *S, ElemType e)

133 {

134 if(S == NULL)

135 return false;

136 assert((S->base != NULL) && (S ->top != NULL));

137 if(S ->top - S ->base >= S->stacksize)

138 {

139 S ->base = (ElemType *)realloc(S ->base,(S ->stacksize + STACKINCREMENT) * sizeof(ElemType));

140 if(! S ->base)

141 exit(0);

142 S ->top = S->base + S ->stacksize;

143 S ->stacksize += STACKINCREMENT;

144 }

145 *(S ->top++) = e;

146 return true;

147 }

148

149 /*------------------------------------------------------------

150 操作目的: 彈棧——刪除棧頂元素

151 初始條件: 棧S已存在且非空

152 操作結果: 刪除S的棧頂元素,並用e返回其值

153 函數參數:

154 SqStack *S 棧S

155 ElemType *e 被刪除的數據元素值

156 返回值:

157 bool 操作是否成功

158 ------------------------------------------------------------*/

159 bool Pop(SqStack *S, ElemType *e)

160 {

161 if((* S).top == (*S).base)

162 return false;

163 *e = * --(* S).top;

164 return true;

165 }

『叄』 二級計算機怎麼理解棧中的初始狀態

棧的內容,畫個圖就好理解

『肆』 數據結構棧的基本操作

InitStack(&S)構造一個空棧;
DestroyStack(&S)棧s被撤銷;
StackLength(S)計算棧的個數;
StackEmpty(S)初始條件:棧 S 已存在。 操作結果:若棧 S 為空棧,則返回 TRUE,否則 FALE;
GetTop(S, &e) 初始條件:棧 S 已存在且非空。操作結果:用 e 返回 S 的棧頂元素。
Push(&S, e) 初始條件:棧 S 已存在。 操作結果:插入元素 e 為新的棧頂元素。
Pop(&S, &e) 初始條件:棧 S 已存在且非空。 操作結果:刪除 S 的棧頂元素,並用 e 返回其值。

『伍』 怎麼初始化順序棧

#include<stdio.h>
#include<stdlib.h>
#define elemtype int

typedef struct LsNode{
elemtype *elem;//給棧以動態形式分配內存,elem=(elemtype *)malloc(sizeof(elemtype)*length);
int length; //棧的空間大小,可以由用戶來決定它的大小
int top;
} STACK;
//順序存儲的棧結構,以及其相應演算法

void InitStack(STACK *S, int len)
{//初始化空棧
S->length=len;
S->elem = (elemtype *)malloc(sizeof(elemtype)*len);
S->top = -1;
}

int EmptyStack(STACK *S)
{//判斷是否棧空,為空則返回1,否則返回0
if(S->top==-1){
return 1;
}
else{
return 0;
}
}

int push(STACK *S, elemtype x)
{//元素x進棧操作,成功返回1,否則返回0
if(S->top<S->length-1){
S->top++;
S->elem[S->top]=x;
return 1;
}
else{
return 0;
}

}

elemtype pop(STACK *S)
{//出棧操作,返回出棧元素
elemtype x;
if(EmptyStack(S)){
printf("棧為空");
return 0;
}
else{
x=S->elem[S->top];
S->top--;
return x;
}
}

void Print(STACK *S)
{//依次輸出棧頂到棧底的所有元素
int i;
for(i=S->top;i>=0;i--){
printf("%4d",S->elem[i]);
}
printf("\n");
}

int main(void)
{
STACK *s=(STACK*)malloc(sizeof(STACK));
InitStack(s,100);
push(s,1);
push(s,2);
push(s,4);
Print(s);
push(s,5);
Print(s);
pop(s);
Print(s);

}

『陸』 動態和靜態存儲區中數據的初始化有什麼不同

c語言中需要內存來存放數據。而內存主要分為兩類:靜態存儲區和動態存儲區;
1.靜態存儲區分為:只讀數據(READONLY DATA)區、以讀寫數據(RW DATA)區、未初始化區(BSS)。它們都是在程序編譯連接階段確定的,在程序執行的階段不會改變。
2.動態存儲區分為堆和棧。都是程序執行的過程中動態分配的,大小也隨之動態變化。從內存管理的實現的角度看來,堆使用的鏈表實現的,而棧使用的是線性存儲的方法。
棧:棧是先進後出,實際的操作中,棧內存可以有滿棧和空棧的情況,滿棧的情況下,棧指針當前的位子是已經使用的的棧區域;空棧的情況是,棧指針當前的位子是沒有使用的棧區域,所以兩種情況的出入棧,指針和數據的操作先後順序是不同的。
滿棧時:入棧,是先移動指針,在放入數據;出棧則是先出數據,在移動指針;
空棧時:入棧,是先放入數據,在移動指針。出棧則是先移動指針,在出數據;

C語言必須注意的幾個問題:
1.內存泄露:申請一塊內存,但沒有釋放,程序結束也沒回收,導致其他程序不能使用
2.野指針:指一個內存指針已經被釋放free或者realloc,但指針依然在使用。避免野指針的情況,將內存的指針置為NULL,並在程序使用的時候判斷該內存是否為NULL,如為空,則認為該內存已經釋放,不對內存進行訪問。
3.非法釋放內存:原則上講只有被malloc(),calloc()或realloc()分配並通過返回值返回返回的內存才能被釋放,否則釋放除此以外的內存都是非法的。即使有一個指針是*p是malloc,那麼對p1=p++,這個時候free(p1)也是不合法的,但free(p)確實可以的。同樣釋放函數中的局部變數也是非法的.還有一種情況是,對一個堆內存釋放兩次也是錯誤的用法。因為free()函數是不能釋放未分配的堆內存。在程序使用free釋放內存之後,應該將指針置為NULL,free一個NULL地址是沒有問題的。

『柒』 C語言數據結構中,關於棧的初始化的問題!

不過是把int *S; S=(int*)malloc(sizeof(int));這兩條語句合並成了一條而已

『捌』 為何在棧初始化時使用的是指針變數

這里就要牽涉到動態內存分配了,棧的定義如下

typedef struct IStack{
char *top; // 此為棧頂指針

char *base; // 此為棧底指針

int stackSize; // 此為棧的總大小

}IStack;
當對棧進行初始化時,我們來對其進行動態內存分配,假設程序中有個宏定義
#define MAX_SIZE 100 //用來定義棧的初始大小

void initStack(IStack *S){
S->base=(char*)malloc(sizeof(char)*MAX_SIZE);
if(!S->base) exit(0);

S->top=S->base;
S->stackSize=MAX_SIZE;
}
以上是初始化函數,也許直到此時,樓主依然不覺得使用指針有什麼用處,那麼接下來讓我們思考一下如何對棧進行增加數據,說到這里的話,樓主可能就要好笑的說:不是這樣增加的嗎?——
*S->top='a';S->top++;
但是樓主要注意了,棧的初始大小隻有100個char類型的空間,所以要是存儲的字元超過了100個怎麼辦,這時候動態內存分配的強大就體現了,沒錯,動態內存允許我們在程序運行時為棧(指針實現)分配內存,分配語句如下:
#define OFFSETSIZE 10

S->base=(char*)realloc(S->base,(S->stackSize+OFFSETSIZE)*sizeof(char));
S->top=S->base+S->stackSize;
S->stackSize+=OFFSETSIZE;

樓主此時或許明白了一些問題,但是樓主在寫main函數時,可能又遇到了一個問題,那就是如何給函數傳遞棧的參數,我們就拿棧的初始化函數initStack(IStack *S)來舉例:
int main(){
IStack s;
initStack(&s);// 這里是傳址調用,而非傳值調用

return 0;

}

什麼是傳址調用,什麼是傳值調用,樓主可能覺得非常困惑,且聽在下細細道來:
所謂的傳值調用,只是把變數的值傳遞給了函數,即在函數中對那個傳遞過來的值無論作了什麼修改,都不會體現到變數的本身上去,也就是變數的值並不會改變,因為變數僅僅是將本身的值傳遞給了函數,也就相當於變數將本身的一個副本傳遞給了函數,函數就算修改,修改的也不過是這個副本,與變數本身並沒有關系
而所謂的傳址調用就不同了,傳址調用也就是將變數在內存中的地址傳遞給了函數,函數對這個地址上的值所做的任何修改都會體現到變數本身上去
我們在main函數中初始化棧s時必須進行傳址調用(除非你採用返回值的方式,一般不推薦如此),否則我們對棧的初始化就不會體現到s本身上

『玖』 為什麼棧的初始狀態top等於m+1,則說明棧空時top=m+1

這是因為棧的初始狀態是確定的。而棧的初始狀態,也就是棧空的狀態。所以,如果當棧的初始狀態top等於m+1。那棧空時的top就等於m+1了。

棧的順序存儲空間為S(1:50),初始狀態為top=0。現經過一系列入棧與退棧運算後,top=20,則棧頂-棧底=20-0=20個元素。

棧是向上增長的,每次壓入一個元素,棧的TOP指針向上移動一位。當壓入第一個元素時,TOP指針指向m+1-1 = m當壓入第二個元素時,TOP指針指向m+1-2 = m-1。以此類推,當壓入第N個元素時,TOP指針指向m+1-N = 20則N = m+1-20 = m-19。

(9)動態存儲中棧的初始條件擴展閱讀:

棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為先進後出表。

在計算機系統中,棧則是一個具有以上屬性的動態內存區域。程序可以將數據壓入棧中,也可以將數據從棧頂彈出。在i386機器中,棧頂由稱為esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。