『壹』 數據結構里順序存儲和鏈式存儲判定棧空和棧滿的條件分別是什麼
順序
空 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的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大。