1. 程式人生 > >資料結構-棧之二進位制轉十進位制和八進位制

資料結構-棧之二進位制轉十進位制和八進位制

棧滿則後進先出原則,我們可以利用此特性實現二進位制轉十進位制、二進位制轉八進位制、二進位制轉十六進位制等相關操作,廢話不多說,直接上程式碼。

二進位制轉十進位制:


//
// Created by Administrator on 2018/5/28.
//

//二進位制轉十進位制

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define ElementType int
#define MaxSize 10

////定義棧的結構體
typedef struct {
    ElementType *top;//棧頂指標(這裡定義為指向棧頂元素的下一個位置,即為空)
    ElementType *base;//棧底指標
    int stackSize;//棧的容量
} Stack;

/**
 *  初始化棧
 * @param s
 */
void InitStack(Stack *s) {
    //初始化分配棧的總空間
    s->base = (ElementType *) malloc(MaxSize * sizeof(ElementType));
    if (!s->base) {
        //分配失敗
        exit(0);
    }
    s->top = s->base;
    s->stackSize = MaxSize;
}

/**
 * 入棧
 * @param s 棧
 * @param e 入棧元素
 */
void Push(Stack *s, ElementType e) {
    //判斷棧是否已滿
    if (s->top - s->base >= s->stackSize) {
        //棧已滿
        //處理方式1.遞增空間 2.退出
        printf("棧已滿~\n");
        exit(0);
    }
    *(s->top) = e; //賦值
    s->top++;
}

/**
 * 出棧
 * @param s 棧
 * @return
 */
ElementType Pop(Stack *s) {
    //判斷棧是否為空
    if (s->base == s->top) {
        //棧為空
        printf("不好意思,棧目前為空~\n");
        exit(0);
    }
    s->top--;
    ElementType e = *(s->top);//取值,並不是取地址
    return e;
}

/**
 * 釋放棧
 * @param s
 */
void FreeStack(Stack *s) {
    if (!s) {
        printf("棧空,不需要釋放\n");
    } else {
        free(s->base);
        free(s);
        printf("棧釋放完成~\n");
    }
}

/**
 * 棧當前容量
 * @param s
 * @return
 */
ElementType GetLen(Stack s) {
    int len = (s.top - s.base);
    return len;
}

int main() {
    printf("二進位制轉十進位制!\n");
    Stack stack;
    InitStack(&stack);
    int data[] = {1, 0, 1, 1, 0, 1};
    int length = sizeof(data) / sizeof(data[0]);  //陣列佔記憶體總空間,除以單個元素佔記憶體空間大小
    int sum = 0;
    printf("二進位制資料入棧\n");
    for (int i = 0; i < length; i++) {
        Push(&stack, data[i]);
        int e = Pop(&stack);
        printf("%d", e);
        sum = sum + e * pow(2, i);
    }
    printf("\n十進位制結果=%d", sum);
    return 0;
}

二進位制轉八進位制:

//
// Created by Administrator on 2018/5/28.
//

//二進位制轉八進位制
//注:二進位制轉八進位制是通過獲取二進位制中每三位資料計算一個八進位制值,如果高位不足三位則通過補0的方式湊齊
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define ElementType int
#define MaxSize 10

//定義棧的結構體
typedef struct {
    ElementType *top;//棧頂指標(這裡定義為指向棧頂元素的下一個位置,即為空)
    ElementType *base;//棧底指標
    int stackSize;//棧的容量
} Stack;

/**
 *  初始化棧
 * @param s
 */
void InitStack(Stack *s) {
    //初始化分配棧的總空間
    s->base = (ElementType *) malloc(MaxSize * sizeof(ElementType));
    if (!s->base) {
        //分配失敗
        exit(0);
    }
    s->top = s->base;
    s->stackSize = MaxSize;
}

/**
 * 入棧
 * @param s 棧
 * @param e 入棧元素
 */
void Push(Stack *s, ElementType e) {
    //判斷棧是否已滿
    if (s->top - s->base >= s->stackSize) {
        //棧已滿
        //處理方式1.遞增空間 2.退出
        printf("棧已滿~\n");
        exit(0);
    }
    *(s->top) = e; //賦值
    s->top++;
}

/**
 * 出棧
 * @param s 棧
 * @return
 */
ElementType Pop(Stack *s) {
    //判斷棧是否為空
    if (s->base == s->top) {
        //棧為空
        //printf("\n不好意思,棧目前為空~\n");
        return -1;
    }
    s->top--;
    ElementType e = *(s->top);//取值,並不是取地址
    return e;
}

/**
 * 釋放棧
 * @param s
 */
void FreeStack(Stack *s) {
    if (!s) {
        printf("棧空,不需要釋放\n");
    } else {
        free(s->base);
        free(s);
        printf("棧釋放完成~\n");
    }
}

/**
 * 棧當前容量
 * @param s
 * @return
 */
ElementType GetLen(Stack s) {
    int len = (s.top - s.base);
    return len;
}

int main() {
    printf("二進位制轉八進位制!\n");
    Stack stack, stack1;
    InitStack(&stack);
    InitStack(&stack1);
    int data[] = {1, 0, 1, 1, 0,1,0};
    int length = sizeof(data) / sizeof(data[0]);  //陣列佔記憶體總空間,除以單個元素佔記憶體空間大小
    printf("二進位制資料入棧~\n");
    for (int i = 0; i < length; i++) {
        printf("%d", data[i]);
        Push(&stack, data[i]);
    }
    //獲取棧當前的長度
    int currentLen = GetLen(stack);
    int sum = 0;
    int k = 1;
    if (currentLen < 3) {
        //如果棧當前容量不足3位則補足3位
        currentLen = 3;
    } else {
        //如果當前棧容量為基數即不是3的倍數,則湊為3的倍數(方便接下來便利計算)
        int mod = currentLen % 3;
        if (mod != 0) {
            currentLen = currentLen + (3 - mod);
        }
    }
    for (int j = 0; j < currentLen; j++) {
        ElementType e = Pop(&stack);
        if (e == -1) {
            //如果二進位制中不存在資料(說明該棧不是3的倍數),通過高位補0的方式處理
            e = 0;
            if (k % 3 != 0) {
                k++;
            } else{
                sum = sum + e * pow(2, k - 1);
                Push(&stack1, sum);
            }
        } else {
            //二進位制棧中存在資料,按取3位計算一次,然後入八進位制棧
            sum = sum + e * pow(2, k - 1);
            if (k % 3 == 0) {
                Push(&stack1, sum);
                sum = 0;
                k = 1;
                continue;
            }
            k++;
        }
    }
    int s2Len = GetLen(stack1);
    printf("\n八進位制結果資料出棧:\n");
    for (int l = 0; l < s2Len; l++) {
        ElementType e = Pop(&stack1);
        printf("%d", e);
    }
    return 0;
}

注:以上程式碼為個人的拙見,存在不足之處,還請大家多多海涵!