C語言用棧頂和棧底指標實現棧的操作及用棧實現數值轉換
阿新 • • 發佈:2019-02-07
棧是一種先進先出(FIFO)的資料結構。。廢話不多說,直接貼程式碼
程式碼參考了小甲魚的資料機構課程
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <math.h> #include <windows.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 //一次增加10的空間 #define ERROR 0 #define OK 1 typedef int Status; typedef int Elemtype; typedef struct Stack { Elemtype *top; Elemtype *base; int StackSize; }*Sqstack; //構建一個棧// void InitStack(Sqstack s) { s->base = (Elemtype *)malloc(STACK_INIT_SIZE * sizeof(Elemtype)); if (!s->base) exit(ERROR); s->top = s->base; s->StackSize = STACK_INIT_SIZE; } //入棧操作// Status Push(Sqstack s, Elemtype e) { //將e的內容入棧 //如棧滿則追加空間 if (s->top - s->base >= s->StackSize) { //兩個地址相減實際上結果是地址差除以每個元素的地址值,也就是元素個數 //這裡實際上等於才是邊界條件,因為我們的棧top指向空白的空間 s->base = (Elemtype *)realloc(s->base, (s->StackSize + STACKINCREMENT) * sizeof(Sqstack)); if (!s->base) exit(ERROR); s->top = s->base + s->StackSize; s->StackSize = s->StackSize + STACKINCREMENT; } *(s->top) = e;//將e放入記憶體空間 s->top++; //top繼續加一,指向沒使用的空間 return OK; } //出棧操作// Status Pop(Sqstack s, Elemtype *e) { //出棧之後將元素返回給e //判斷棧是否為空棧 if (s->top == s->base) //此時棧是空棧 return ERROR; s->top--; //top先減一,指向有元素的記憶體單元 *e = *(s->top); return OK; } //清空棧// Status ClearStack(Sqstack s) { //實際上就是把頭指標賦值給尾指標 s->top = s->base; return OK; } //銷燬一個棧// Status DestoryStack(Sqstack s) { //銷燬一個棧就是要清空棧的記憶體空間 int i, len; len = s->StackSize; for (i = 0; i < len; i++) { free(s->base); s->base++; } s->base = s->top = NULL; s->StackSize = 0; return OK; } //棧內元素個數// int Stacklen(Sqstack s) { return (s->top - s->base); }
以上就是簡單的棧的抽象資料型別,下面貼主函式來實現數值的轉換
int main() { Sqstack s = (Stack *)malloc(1 * sizeof(Sqstack)); InitStack(s); int a[8] = { 1,1,0,0,1,0,0,1 }; int b,c=0;//b用來存放結果,c用來存放十進位制結果 for (int i = 0; i < 8; i++) //8次入棧操作 Push(s, a[i]); for (int i = 0; i < 8; i++) { //8次出棧操作 Pop(s, &b);//b就是出棧的數 //二進位制從最低位開始出來 c += b * pow(2, i); } printf("轉換成十進位制數:%d", c); return 0; }
最後的執行結果:
PS:pow()函式有兩個引數,第一個引數是底數,第二個引數是指數。。。返回的值應該是double型的,vs有給我double轉換成int丟失精度的提醒。