日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构基础笔记】【栈】

發布時間:2023/12/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构基础笔记】【栈】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼參考《妙趣橫生的算法.C語言實現》

文章目錄

  • 前言
    • 1、棧的定義
    • 2、創建一個棧
    • 3、入棧和出棧操作
    • 4、棧的清空、銷毀、計算棧的當前容量
    • 5、實例分析


前言

本章總結:棧的定義、創建棧,銷毀棧,入棧出棧操作等操作。


1、棧的定義

棧是一種重要的線性結構。是鏈表和順序表的具體形式。

stack是一個后進先出的線性表。棧的操作只能限定在這個順序表的表尾進行,我們稱這個地方為棧頂(top),相應的表頭稱為棧底(bottom)

最開始棧中不含有任何數據,叫做空棧,此時棧頂就是棧底。數據從棧頂進入,棧頂棧底分離,棧的容量變大。數據出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小。

用順序表建立棧:

typedef struct {ElemType *base; //指向棧底的指針ElemType *top; //指向棧頂的指針int stacksize; //當前可使用的最大容量 }sqStack;

2、創建一個棧

1、在內存中開辟一段連續的空間,用作棧的物理存儲空間;
2、將棧頂、棧底的地址賦值給top和base,并設置stacksize,以便通過這個變量對棧進行各種操作

#define STACK_INIT_SIZE 100 void initStack(sqStack *s) {//內存中開辟一段連續空間作為??臻g,首地址賦值給s->bases->base = (ElemType*)malloc(sizeof(ElemType) * STACK_INIT_SIZE);if (!s->base){printf("分配內存失敗");exit(0);} //分配內存失敗s->top = s->base; //空棧,棧頂和棧底重合s->stacksize = STACK_INIT_SIZE; //設定最大容量 } /*注意: 要區分棧的最大容量和棧的當前容量兩個概念。 對于此棧,最大容量為100個ElemType 類型空間大小,但是它是一個空棧,因為它里面沒有任何內容 */

3、入棧和出棧操作

入棧:每向棧中壓入一個數據,top指針+1,直到棧滿為止

//入棧 #define STACKINCREMENT 10 void PushStack(sqStack* s,ElemType elem) {if (s->top - s->base >= s->stacksize) //判斷棧是否滿了{//如果棧滿了,追加空間s->base = (ElemType*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(ElemType));if (!s->base) //內存分配失敗{printf("內存分配失敗");exit(0);}s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT; //重置棧的最大容量}*(s->top) = elem; //放入數據s->top++; //top指針+1 }

出棧操作就是棧頂(指針先下移指向棧頂元素)取出元素,棧頂指針隨之下移的操作??梢灾貜统鰲?#xff0c;直道該棧變為空棧為止

//出棧操作 void PopStack(sqStack* s, ElemType *elem) {if (s->top == s->base) return; //棧空了,程序返回s->top--; //top指針-1*elem = *(s->top); //將棧頂元素取出,給elem }

4、棧的清空、銷毀、計算棧的當前容量

1、清空一個棧就是希望棧中的元素全部作廢,而棧本身的物理空間不一定發生變化。
因此只需要將s->top的內容賦值為s->base即可
2、銷毀一個棧是要釋放掉該棧所占據的物理內存空間,因此銷毀與清空棧是兩個不同的操作。

//棧的一些操作:清空一個棧、銷毀一個棧、計算棧當前的容量 //清空一個棧 void ClearStack(sqStack* s) {s->top = s->base; //將棧底指針賦值給棧頂指針,表示棧已變空 } //銷毀一個棧 void DestroyStack(sqStack* s) {free(s->base); //釋放掉內存空間s->base = s->top = NULL; //棧頂棧底指針置NULLs->stacksize = 0; //棧的最大容量設置為0 }//計算棧當前容量 int GetStackLen(sqStack s) {return (s.top - s.base); //這里不對棧中的數據進行修改,所以不需要引用 }

5、實例分析

利用棧的數據結構,將二進制轉換為十進制:

已知公式為:

思路:將一串二進制的0/1碼,從高位到低位順序入棧,再逐一從棧頂取出元素,取出的第i個元素乘上2的i-1次方,并逐一累加,最終得到十進制表達。

#include "stdio.h" #include "malloc.h" #include "conio.h" #include <stdlib.h> #include <math.h> typedef char ElemType ; typedef struct {ElemType *base; //指向棧底的指針ElemType *top; //指向棧頂的指針int stacksize; //當前可使用的最大容量 }sqStack; #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 void initStack(sqStack *s) {//內存中開辟一段連續空間作為棧空間,首地址賦值給s->bases->base = (ElemType*)malloc(sizeof(ElemType) * STACK_INIT_SIZE);if (!s->base){printf("分配內存失敗");exit(0);} //分配內存失敗s->top = s->base; //空棧,棧頂和棧底重合s->stacksize = STACK_INIT_SIZE; //設定最大容量 } /*注意: 要區分棧的最大容量和棧的當前容量兩個概念。 對于此棧,最大容量為100個ElemType 類型空間大小,但是它是一個空棧,因為它里面沒有任何內容 *///入棧 void PushStack(sqStack* s,ElemType elem) {if (s->top - s->base >= s->stacksize) //判斷棧是否滿了{//如果棧滿了,追加空間s->base = (ElemType*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(ElemType));if (!s->base) //內存分配失敗{printf("內存分配失敗");exit(0);}s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT; //重置棧的最大容量}*(s->top) = elem; //放入數據s->top++; //top指針+1 }//出棧操作 void PopStack(sqStack* s, ElemType *elem) {if (s->top == s->base) return; //??樟?#xff0c;程序返回s->top--; //top指針-1*elem = *(s->top); //將棧頂元素取出,給elem }//棧的一些操作:清空一個棧、銷毀一個棧、計算棧當前的容量 //清空一個棧 void ClearStack(sqStack* s) {s->top = s->base; //將棧底指針賦值給棧頂指針,表示棧已變空 } //銷毀一個棧 void DestroyStack(sqStack* s) {free(s->base); //釋放掉內存空間s->base = s->top = NULL; //棧頂棧底指針置NULLs->stacksize = 0; //棧的最大容量設置為0 }//計算棧當前容量 int GetStackLen(sqStack s) {return (s.top - s.base); //這里不對棧中的數據進行修改,所以不需要引用 }int main() { ElemType c;sqStack s;int len = 0, i = 0, sum = 0;printf("請輸入一個二進制數\n");initStack(&s);/*輸入01字符表示的二進制數,以#結束*/scanf("%c",&c);while (c != '#'){PushStack(&s,c);printf("將%c壓入棧中\n",c);scanf("%c", &c);}getchar();len = GetStackLen(s);printf("len:%d\n", len);for(i=0;i<len;i++){PopStack(&s,&c);printf("%c ", c);sum = sum + (c - '0') * pow(2, i); //轉換成十進制}printf("十進制數是:%d\n",sum);DestroyStack(&s); //釋放??臻g_getche();return 0; }

reslut:

總結

以上是生活随笔為你收集整理的【数据结构基础笔记】【栈】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。