C语言栈的简单应用:十进制转八进制

没啥好说的,理解了链表,这个就是手到擒来。不过要注意各个函数的返回值。比如create栈,返回一个指针值,就需要调用它的时候要有变量来接受它的值,不然,后面的值和函数的调用就搞不了。亏我还在这想了超久。难受。废话少说了,上代码。奥利给!

//#include <iostream>
#ifndef stack__h
#define stack__h

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

typedef int T; // 数据元素的数据类型

struct Stack {
    T* data;   // 数据元素存储空间的开始地址
    int top;   // 栈顶的位置
    int max;   // 栈的最大长度
};


Stack* Stack_Create(int maxlen);
// 创建栈

void Stack_Free(Stack* stk);
// 释放栈

void Stack_MakeEmpty(Stack* stk);
// 置为空栈

bool Stack_IsEmpty(Stack* stk);
// 判断栈是否空

bool Stack_IsFull(Stack* stk);
// 判断栈是否满

T Stack_Top(Stack* stk);
// 返回栈顶元素

T Stack_Push(Stack* stk, T e);
// 将元素e压入栈顶
// 返回栈顶点元素

T Stack_Pop(Stack* stk);
// 将栈顶元素出栈
// 返回栈顶元素

void Stack_Print(Stack* stk);
// 打印栈顶到栈低的元素

void Decimal_Conversion_Octal(T e);
//  利用stack栈实现整数的十进制转八进制
//  输入参数:十进制整数 e
//  打印结果,末尾换行

#endif /* stack__h */

Stack* Stack_Create(int maxlen)
// 创建栈
{
    Stack* stk = (Stack*)malloc(sizeof(Stack));
    stk->data = (T*)malloc(sizeof(T) * maxlen);
    stk->max = maxlen;
    stk->top = -1;
    return stk;
}

void Stack_Free(Stack* stk)
// 释放栈
{
    free(stk->data);
    free(stk);
}

void Stack_MakeEmpty(Stack* stk)
// 置为空栈
{
    stk->top = -1;
}

bool Stack_IsEmpty(Stack* stk)
// 判断栈是否空
{
    return -1 == stk->top ;
}

bool Stack_IsFull(Stack* stk)
// 判断栈是否满
{
    return stk->top == stk->max - 1;
}

T Stack_Top(Stack* stk)
// 获取当前栈顶元素
{
    return stk->data[stk->top];
}

T Stack_Push(Stack* stk, T e)
// 将元素e压入栈顶
// 返回栈顶点元素
{
    if (Stack_IsFull(stk)) {
        printf("Stack_IsFull(): stack full error when push element to the stack!\n");
        Stack_Free(stk);
        exit(0);
    }
    else {
        stk->top += 1;
        stk->data[stk->top] = e;
        return Stack_Top(stk);
    }
}

T Stack_Pop(Stack* stk)
// 将栈顶元素出栈
// 返回栈顶元素
{
    if (Stack_IsEmpty(stk)) {
        printf("Stack_IsEmpty(): stack empty error when pop element of the stack top!\n");
        Stack_Free(stk);
        exit(0);
    }
    else {
        T topE = Stack_Top(stk);
        stk->top -= 1;
        return topE;
    }
}

void Stack_Print(Stack* stk)
// 打印栈顶到栈低的元素
{
    if (Stack_IsEmpty(stk)) {
        printf("The stack is empty.\n");
        return;
    }

    //printf("The stack contains: ");
    for (int i = stk->top; i >= 0; i--) {
        printf("%d", stk->data[i]);
    }
    printf("\n");

}

void Decimal_Conversion_Octal(T e)
//  利用stack栈实现整数的十进制转八进制
//  输入参数:十进制整数 e
//  打印e的八进制结果,末尾换行
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    Stack* stk=NULL;
    int maxlen=100;
    stk = Stack_Create(maxlen);
    while (e)
    {
        Stack_Push(stk, e % 8);
        e = e / 8;
    }
    if (!Stack_IsEmpty(stk))
    {
        Stack_Print(stk);
    }
    /********** End **********/
}

int main(int argc, const char* argv[]) {
    T e;
    scanf_s("%d", &e);
    Decimal_Conversion_Octal(e);


    return 0;
}
发布了20 篇原创文章 · 获赞 1 · 访问量 2492

猜你喜欢

转载自blog.csdn.net/m0_46198325/article/details/105051338