基本操作:入棧、出棧、取棧頂元素
基本特性:先進後出
注意:棧本身不能遍歷,不能列印,我們在**中實現的列印只是為了檢查**的正確性
具體操作的詳細解釋在**中會有注釋。
1.順序棧:
在結構體內定義乙個變數以
使用malloc申請記憶體,從而實現將順序表的固定長度修改為可動態擴容
seqstack.h
#pragma once
#include #include #include #define show_name printf("***************====%s***************=\n",__function__);
typedef char seqstacktype;
typedef struct seqstack
seqstack;
seqstack.c
#include "seqstack.h"
void seqstackinit(seqstack* stack)//初始化
stack->size = 0;
stack->capacity = 1000;//元素個數,而非記憶體位元組數
stack->data = (seqstacktype*)malloc(stack->capacity * sizeof(seqstacktype));
return;
}void seqstackdestroy(seqstack* stack)//銷毀
void seqstackresize(seqstack* stack)//擴容函式
if(stack->size < stack->capacity)
stack->capacity = stack->capacity *2 +1;//擴容規則根據自己喜好定,這裡+1是避免傳入的capacity為0
//申請新記憶體
seqstacktype* new_ptr = (seqstacktype*)malloc(stack->capacity * sizeof(seqstacktype));
//將原來資料拷貝到新申請空間裡(不推薦使用realloc)
size_t i = 0;
for(; isize; ++i)
free(stack->data);//釋放舊記憶體
stack->data = new_ptr;
return;
}void seqstackpush(seqstack* stack, seqstacktype value)//元素進棧
if(stack->size >= stack->capacity)//棧已滿,需要擴容
stack->data[stack->size++] = value;
return;
}void seqstackpop(seqstack* stack)//元素出棧
int seqstackgettop(seqstack* stack, seqstacktype* top)//取棧頂元素,返回兩資訊:是否取成功;用輸出型引數top返回取得的棧頂元素
void seqstackprint(seqstack* stack,const char* msg)//列印棧內元素,為了檢測釋放入棧、出棧,實際上是不能列印棧的
printf("\n");
return;
}void testinit()
void testdestroy()
void testpush()
void testpop()
void testgettop()
else
return;
}int main()
2.鏈式棧:
利用與單鏈表類似的方法實現鏈式棧
linkstack.h
#pragma once
#include #include #include #define show_name printf("\n***************====%s***************=\n",__function__);
typedef char linkstacktype;
//typedef struct linknode
//linknode;
typedef struct linkstack//帶頭結點的鏈棧
linkstack;
linkstack.c
#include "linkstack.h"
linkstack* createnode(linkstacktype value)//建立新結點
void linkstackinit(linkstack** stack)//初始化
void linkstackpush(linkstack** stack,linkstacktype value)//元素入棧(尾插)
linkstack* cur = *stack;
while(cur->next != null)
linkstack* new_node = createnode(value);
cur->next = new_node;
new_node->next = null;
return;
}void destroynode(linkstack* node)//銷毀結點
void linkstackpop(linkstack** stack)//元素出棧(尾刪)
linkstack* cur = *stack;
linkstack* pre = null;//最後乙個元素出棧後,還需將其next置空
while(cur->next != null)
pre->next = null;//鍊錶的最後乙個元素的next一定為null
destroynode(cur);
}int linkstackgettop(linkstack* stack,linkstacktype* top)//取棧頂元素(鍊錶的最後乙個元素)
*top = cur->data;
return 1;
}void linkstackdestroy(linkstack** stack)//銷毀棧
*stack = null;
}void linkstackprint(linkstack* stack,const char* msg)//列印棧中元素,檢測一下**是否正確
printf("\n");
return;
}void testinit()
void testpush()
void testpop()
void testgettop()
void testdestroy()
int main()
C語言實現棧(鏈式棧)
由於棧的插入 刪除操作只能在一端進行,而對於線性鍊錶來說,在首端插入或 刪除比在尾端要容易一些,所以,將線性鍊錶的首端作為棧頂端,即將頭指標作為棧頂指標。1 結構體 1 typedef struct nodenode 56 typedef struct my stackstack 2 初始化 1 s...
C 語言實現鏈式棧
鏈式棧是一種資料儲存結構,可以通過單鏈表的方式來實現,使用鏈式棧的優點在於它能夠克服用陣列實現的順序棧空間利用率不高的特點,但是需要為每個棧元素分配額外的指標空間用來存放指標域。棧是只能在某一端插入和刪除的特殊線性表。它按照後進先出的原則儲存資料,先進入的資料被壓入棧底 push 最後的資料在棧頂 ...
C語言實現棧的順序儲存與鏈式儲存
一 實驗目的 1.深入了解棧的定義和特性。2.掌握棧的順序表示 鍊錶表示以及相應操作的實現,鞏固對這兩種結構的構造方法的掌握。3.會靈活運用棧結構解決某些實際問題。二 實驗內容 1.棧的基本操作的實現 初始化 賦值 取值 插入 刪除等 要求分別採用順序和鏈式儲存結構。順序棧源程式 include i...