栈笔试题1

设计一个进制转换程序,使用顺序栈设计一个把十进制数转换为十六进制数的接口,实现当通过键盘输入一个非负的十进制数,可以在终端输出对应的十六进制数。

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

// 定义错误码
#define ERROR_STACK_FULL -1

// 定义顺序栈元素的数据类型
typedef int DataType_t;

// 定义顺序栈的管理结构体
typedef struct SequenceStack {
    DataType_t *Bottom;  // 栈底地址
    unsigned int Size;   // 栈容量
    int Top;             // 栈顶元素的下标
} SeqStack_t;

// 创建顺序栈并初始化
SeqStack_t* SeqStack_Create(unsigned int size) {
    SeqStack_t* Manager = (SeqStack_t *)calloc(1, sizeof(SeqStack_t));
    if (Manager == NULL)
	{
        perror("calloc memory for manager is failed");
        exit(-1);
    }

    Manager->Bottom = (DataType_t *)calloc(size, sizeof(DataType_t));
    if (Manager->Bottom == NULL) 
	{
        perror("calloc memory for Stack is failed");
        free(Manager);
        exit(-1);
    }

    Manager->Size = size;
    Manager->Top = -1;

    return Manager;
}

// 判断顺序栈是否已满
bool SeqStack_IsFull(SeqStack_t* Manager) 
{
    return Manager->Top + 1 == Manager->Size;
}

// 入栈
int SeqStack_Push(SeqStack_t* Manager, DataType_t Data) 
{
    if (SeqStack_IsFull(Manager)) {
        return ERROR_STACK_FULL;
    }

    Manager->Bottom[++Manager->Top] = Data;
    return 0;
}

// 判断顺序栈是否为空
bool SeqStack_IsEmpty(SeqStack_t* Manager) 
{
    return Manager->Top == -1;
}

// 出栈
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{
    DataType_t temp = 0;  //用于存储出栈元素的值

	//1.判断顺序栈是否为空
	if ( SeqStack_IsEmpty(Manager) )
	{
		printf("SeqStack is Empty!\n");
		return ERROR_STACK_FULL;
	}
}

// 遍历顺序栈元素并打印
void SeqStack_Print(SeqStack_t* Manager) 
{
    printf("它的十六进制数:0x");
    for (int i = 0; i <= Manager->Top; ++i) {
        printf("%d", Manager->Bottom[i]);
    }
    printf("\n");
}

// 释放顺序栈占用的内存
void SeqStack_Destroy(SeqStack_t* Manager) 
{
    free(Manager->Bottom);
    free(Manager);
}

int main(int argc, char const *argv[]) 
{
    SeqStack_t *top = SeqStack_Create(10);//创建一个顺序栈
    DataType_t data ;                     //定义顺序栈元素的数据类型
    printf("请输入一个非负数的整数:");
    scanf("%d",&data);
    while(data)
    {
        SeqStack_Push (top, data%16);     //把输入的数取余 
        data = data/16;                   //取余后记录剩下的元素
    }
    DataType_t p;                         //定义一个数用于输出遍历
    while (1)
    {        
        p = SeqStack_Pop(top);              
        SeqStack_Print(top) ;             //数据出栈遍历
        if (!SeqStack_IsEmpty(top))       //判断栈是否为空,为空就退出
        {
            break;
        }
        
    }
    

    return 0;
}
posted @ 2024-04-25 10:46  Ikin粉  阅读(28)  评论(0)    收藏  举报