生活随笔
收集整理的這篇文章主要介紹了
【数据结构基础笔记】【栈】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼參考《妙趣橫生的算法.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
)
{s
->base
= (ElemType
*)malloc(sizeof(ElemType
) * STACK_INIT_SIZE
);if (!s
->base
){printf("分配內存失敗");exit(0);} s
->top
= s
->base
; s
->stacksize
= STACK_INIT_SIZE
;
}
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
++;
}
出棧操作就是棧頂(指針先下移指向棧頂元素)取出元素,棧頂指針隨之下移的操作??梢灾貜统鰲?#xff0c;直道該棧變為空棧為止
void PopStack(sqStack
* s
, ElemType
*elem
)
{if (s
->top
== s
->base
) return; s
->top
--; *elem
= *(s
->top
);
}
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; s
->stacksize
= 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
->base
= (ElemType
*)malloc(sizeof(ElemType
) * STACK_INIT_SIZE
);if (!s
->base
){printf("分配內存失敗");exit(0);} s
->top
= s
->base
; s
->stacksize
= STACK_INIT_SIZE
;
}
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
++;
}
void PopStack(sqStack
* s
, ElemType
*elem
)
{if (s
->top
== s
->base
) return; s
->top
--; *elem
= *(s
->top
);
}
void ClearStack(sqStack
* s
)
{s
->top
= s
->base
;
}
void DestroyStack(sqStack
* s
)
{free(s
->base
); s
->base
= s
->top
= NULL; s
->stacksize
= 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
);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
); _getche();return 0;
}
reslut:
總結
以上是生活随笔為你收集整理的【数据结构基础笔记】【栈】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。