任意十進制非負整數轉化爲八進制

NOTICE: 本題代碼是按照源碼順序貼上的,複製可直接運行

環境: Visual Stdio Code

題目:

對於輸入的任意一個非負十進制整數,算出它的八進制。

說明:

嚴蔚敏版《數據結構》的第 48 頁的算法有個問題:

  出棧的時候必須有取地址符,不然會以一種類似於 copy 的形式出棧。

我稍微改了一下,畢竟書上寫的是近似於僞碼的算法(只是寫個思路嘛,可以理解的)。

代碼:

初始化:

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

#define STACK_INIT_SIZE 10  // 初始分配量
#define STACKINCREMENT 1  // 分配增量
#define OK 1
#define ERROR 0

typedef int Status;
typedef int SElemType;

typedef struct 
{
    SElemType *base;
    SElemType *top;
    int stacksize;;
}SqStack;

Status InitStack(SqStack &S)
{   // 初始化
    S.base = (SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
    if(!S.base) return ERROR;
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}//InitStack

銷燬:

Status DestroyStack(SqStack &S)
{   // 銷燬 
    if(S.base)
    {
        delete S.base;
        S.stacksize = 0;
        S.base = S.top = NULL;
    }
    return OK;
}//DestroyStack

入棧:

Status Push(SqStack &S, SElemType e)
{   // 入棧
    if(S.top - S.base == S.stacksize)
    {
        S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S.base) return ERROR;
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top ++= e;
    return OK;
}//Push

出棧:

Status Pop(SqStack &S, SElemType *e)
{   // 出棧
    if(S.top == S.base) return ERROR;
    *e = *--S.top;
    return OK;
}//Pop

判斷是否爲空棧:

Status StackEmpty(SqStack &S)
{   // 判斷是否爲空 
    return S.top - S.base == 0;
}//StackEmpty

打印棧:

Status StackTraverse(SqStack &S)
{   // 打印棧
    SElemType *p = (SElemType *)malloc(sizeof(SElemType));
    p = S.top;
    if(!p) return ERROR;
    else
    {
        p--;
        while(p >= S.base)
        {
            printf("%d\t", *p);
            p--;
        }
    }
    return OK;
}//StackTraverse

主函數:

int main()
{
    SqStack S;
    int N;
    SElemType e;
    if(InitStack(S)) printf("\n初始化棧成功!\n");
    printf("\n請輸入想要轉換的非負十進制整數(以回車鍵結束):\n");
    scanf("%d", &N);
    getchar();
    while(N)
    {
        Push(S, N %8);
        N = N / 8;
    }
    printf("\n創建好的順序棧爲:\n");
    StackTraverse(S);
    printf("\n該數對應的八進制數爲:\n");
    while(!StackEmpty(S))
    {
        Pop(S, &e);  // 出棧時要有取地址符,以確保地址的更新,防止 copy 的出現
        printf("%d", e);    
    }

    return OK;
}

結果示意圖:

THE END!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章