通過"棧"-將2進位制數轉為10進位制數(資料結構)
通過-棧-將2進位制數轉為10進位制數(資料結構)
原理
- 原理比較簡單,我們輸入一個二進位制數(用
char[]
讀取),以 # 結束輸入,比方說為0111#
表示輸入二進位制數字0111
,將這個char[]
從下標為0到4依次壓入棧中,由於棧有先入後出的特性,所以最後出棧的時候的順序和入棧的順序是相反的,根據式
其中 Decimal 表示將一個二進位制數轉換為十進位制的函式。
malloc
,需檢查是否申請成功。程式碼
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef unsigned char Tp;
#define STACKMAXCAP 10 //棧容量
#define EXPANSIONUNIT 5 //每次棧擴容單位
typedef struct {
Tp *pBase;//棧底
Tp *pTop;//棧頂
int nCap = STACKMAXCAP;//棧容量
}Stack;
void InitStack(Stack *stack)
{
stack->pTop = (Tp*)malloc( sizeof(Tp) );
//注意這裡,記憶體申請有可能不成功,需判斷
if (!stack->pTop)
{
exit(0);
}
stack->pBase = stack->pTop;
}
//計算當前棧大小函式
int SizeOfStack(Stack *stack)
{
return stack->pBase - stack->pTop;
}
//入棧函式
void PushStack(Stack *stack, Tp data)
{
//注意這裡,為了防止堆疊溢位,如果超出堆疊大小
//需重新分配堆疊記憶體
if (SizeOfStack(stack) > STACKMAXCAP)
{
stack->pTop = (Tp*)realloc(stack->pTop, (SizeOfStack(stack)+EXPANSIONUNIT)*sizeof(Tp));
}
else
{
*(stack->pTop) = data;
--stack->pTop;
}
}
//出棧函式
Tp PopStack(Stack *stack)
{
Tp temp;
//注意這裡,出棧資料並非棧頂指標所指資料,為棧頂 (指標+1) 的那個資料
if (stack->pTop ==stack->pBase)
{
return 0;
}
else
{
temp = *(stack->pTop + 1);
++stack->pTop;
return temp;
}
}
int main()
{
Stack stack;
InitStack(&stack);
printf("please input Binary number: (input '#' to overinput)\n");
Tp cTemp;
while(1)
{
cTemp = getchar();
if ( cTemp!='#' )
{
PushStack(&stack, cTemp);
}
else
{
break;
}
}
int dec = 0;
int i = 0;
while (1)
{
// 注意這裡棧頂小於棧底的時候,才是棧有資料的時候
if (stack.pTop < stack.pBase)
{
dec = dec + (PopStack(&stack) - 48)*pow(2, i);
++i;
}
else
{
break;
}
}
printf("Corresponding Decimal number : %d\n ",dec);
system("pause");
return 0;
}