<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
首先我們思考一個問題,什麼是棧?
棧是資料結構的一種,棧在我們日常編碼中遇到的非常多,很多人對棧的接觸可能僅僅侷限在 遞迴使用的是棧 和 StackOverflowException,棧是一種後進先出的資料結構(可以想象生化金字塔的牢房和生化角鬥場的狗洞)。
棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素
棧的應用廣泛,比如你的程式執行檢視呼叫堆疊、計算機四則加減運算、演演算法的非遞迴形式、括號匹配問題等等。所以棧也是必須掌握的一門資料結構。最簡單大家都經歷過,你拿一本書上下疊在一起,就是一個後進先出的過程,你可以把它看成一個棧。下面我們介紹陣列實現的棧兩種形式。
一般不推薦使用這種方法,因為當空間不夠用時,增容會有點麻煩,不實用。
typedef struct Stack { STDataType _a[]; //STDataType 為int宏定義,當然你也可以將它定義為其他型別,宏定義是為了換棧型別的時候方便一點 int _top; // 棧頂 int _capacity; // 容量 }Stack;
相比靜態棧,動態棧空間不夠時可以直接時用realloc動態擴容,但是動態擴會有一定程度的消耗,我們會直接擴容一倍,當使用不完時會造成一定程度的空間浪費。
typedef struct Stack { STDataType* _a;//指向一塊開闢出來的連續空間的指標 int _top; // 棧頂 int _capacity; // 容量 }Stack;
棧要實現的操作
// 初始化棧 void StackInit(Stack* ps); // 入棧 void StackPush(Stack* ps, STDataType data); // 出棧 void StackPop(Stack* ps); // 獲取棧頂元素 STDataType StackTop(Stack* ps); // 獲取棧中有效元素個數 int StackSize(Stack* ps); // 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0 bool StackEmpty(Stack* ps); // 銷燬棧 void StackDestroy(Stack* ps);
棧的初始化
void StackInit(Stack* ps) { ps->_a = NULL; //初始化時將指標指向空,此時沒有開闢空間 //這裡可以將top賦值為0,也可以賦值為-1。 ps->_top = -1; //賦值為0時表示top為棧頂元素的下一個位置的下標,賦值為-1時top為棧頂元素的下標 ps->_capacity = 0; //棧的容量 }
入棧
void StackPush(Stack* ps, STDataType data) { assert(ps); //考慮要不要增容 //當top為0時判斷條件為 //if(ps->top==ps->_capacity) if (ps->_top+1 == ps->_capacity)//當棧滿時進入 { //判斷當前棧的容量是否為0,為0的話開闢4個空間,不為0時擴容一倍 int newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2; STDataType* tmp = realloc(ps->_a, sizeof(STDataType) * newcapacity); if (tmp == NULL) { exit(-1); } ps->_a = tmp; ps->_capacity = newcapacity; } //擴容完成,或者不用擴容,開始插入 ps->_top++; ps->_a[ps->_top] = data; //當top為0時插入操作 //ps->_a[ps->_top] = data; //ps->_top++; }
出棧
void StackPop(Stack* ps) { assert(ps); //判斷是否為空 assert(!StackEmpty(ps));//暴力判斷 //if (top==-1)//溫柔判斷 //{ // printf("棧已經空了!n"); // exit(-1); //甩出異常 //} ps->_top--; }
取棧頂元素
STDataType StackTop(Stack* ps) { assert(ps); //判斷是否為空,為空甩出異常。 assert(!StackEmpty(ps)); //if (!StackEmpty(ps)) { // printf("棧為空!n"); // exit(-1); //} return ps->_a[ps->_top]; //返回棧頂元素 }
判斷棧中有幾個有效資料
//取出棧裡有效元素個數。 int StackSize(Stack* ps) { assert(ps); return ps->_top+1; }
判斷棧是否為空
bool StackEmpty(Stack* ps) { assert(ps); return ps->_top == -1; //ps->_top為-1返回true,否則返回false. }
銷燬棧
銷燬棧是必不可少的的一步,如果沒有銷燬的話會造成記憶體洩露
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->_a);
ps->_a = NULL;
ps->_top = -1;
ps->_capacity = 0;
}
最後介紹一下鏈棧,這裡就不實現了有興趣的話可以自己實現一下。
鏈棧和連結串列一樣的,也是通指標將各個資料塊連結起來的
設計鏈棧是最好設計為雙向連結串列,否則當你設計為用尾作棧頂是出棧效率低。
用頭做棧頂時,頭插頭刪,可以設計為單連結串列。
到此這篇關於C語言 棧與陣列的實現詳解的文章就介紹到這了,更多相關C語言 棧與陣列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45