1. 程式人生 > >通過"棧"-將2進位制數轉為10進位制數(資料結構)

通過"棧"-將2進位制數轉為10進位制數(資料結構)

通過-棧-將2進位制數轉為10進位制數(資料結構)

原理


  • 原理比較簡單,我們輸入一個二進位制數(用char[]讀取),以 # 結束輸入,比方說為 0111# 表示輸入二進位制數字0111,將這個char[]從下標為0到4依次壓入棧中,由於棧有先入後出的特性,所以最後出棧的時候的順序和入棧的順序是相反的,根據式
20+1∗21+1∗22+0∗23=1+2+4=7" role="presentation"> D e c i m a l
( 0111 ) = 1 2 0 + 1
2 1 + 1 2 2 + 0 2 3 = 1 + 2 + 4 = 7

其中 Decimal 表示將一個二進位制數轉換為十進位制的函式。
  • 這裡我們使用堆來模擬棧,為的就是要演示這個原理而已,請勿深究。申請堆記憶體的時候使用malloc,需檢查是否申請成功。
  • 需要注意的是不僅要注意棧的上溢位(經常出現在 push 動作),還要注意棧的下溢位(常見於 pop 動作)。棧的上溢位非常有名,經常拿來用作為黑客攻擊,粗心的程式設計師往往忽視棧溢位的情況,而使得黑客有機可乘,通過棧溢位,覆蓋原有指令,可以使程式跳轉到不可意料的地方,為了防止堆疊溢位,需要在壓棧的時候檢查時候超過了棧的容量(capacity)。同樣的下溢位也是需要避免的,我們在 pop 的時候,要檢查是否到了棧底了,如果到了棧底,則沒有資料了,也 pop 不了的了,如果這個時候進行 pop,會有意想不到的錯誤。
  • 程式碼


    
    #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;
    }

    執行結果

    這裡寫圖片描述