十进制转十六进制输出
/*******************************************************************
*
* 文件名称 : 十进制转十六进制输出
* 文件作者 : [email protected]
* 创建日期 : 2024/04/25
* 文件功能 : 对双向链表的增删改查功能的定义
* 注意事项 : None
*
* CopyRight (c) 2024 [email protected] All Right Reseverd
*
* *****************************************************************/
本函数所调用的标准库
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
定义顺序栈中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;
构造记录顺序栈SequenceStack各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
typedef struct SequenceStack
{
DataType_t *Bottom; // 记录栈底地址
unsigned int Size; // 记录栈容量
int Top; // 记录栈顶元素的下标
} SeqStack_t;
创建顺序表并对顺序栈进行初始化
SeqStack_t *SeqStack_Create(unsigned int size)
{
// 1.利用calloc为顺序栈的管理结构体申请一块堆内存
SeqStack_t *Manager = (SeqStack_t *)calloc(1, sizeof(SeqStack_t));
if (NULL == Manager)
{
perror("calloc memory for manager is failed");
exit(-1); // 程序异常终止
}
// 2.利用calloc为所有元素申请堆内存
Manager->Bottom = (DataType_t *)calloc(size, sizeof(DataType_t));
if (NULL == Manager->Bottom)
{
perror("calloc memory for Stack is failed");
free(Manager);
exit(-1); // 程序异常终止
}
// 3.对管理顺序栈的结构体进行初始化(元素容量 + 最后元素下标)
Manager->Size = size; // 对顺序栈中的容量进行初始化
Manager->Top = -1; // 由于顺序栈为空,则栈顶元素的下标初值为-1
return Manager;
}
判断顺序栈是否已满
bool SeqStack_IsFull(SeqStack_t *Manager)
{
return (Manager->Top + 1 == Manager->Size) ? true : false;
}
// 入栈
bool SeqStack_Push(SeqStack_t *Manager, DataType_t Data)
{
// 1.判断顺序栈是否已满
if (SeqStack_IsFull(Manager))
{
printf("SeqStack Full is Full!\n");
return false;
}
// 2.如果顺序栈有空闲空间,则把新元素添加到顺序栈的栈顶
Manager->Bottom[++Manager->Top] = Data;
return true;
}
判断顺序栈是否为空
bool SeqStack_IsEmpty(SeqStack_t *Manager)
{
return (-1 == Manager->Top) ? true : false;
}
// 出栈
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{
DataType_t temp = 0; // 用于存储出栈元素的值
// 1.判断顺序栈是否为空
if (SeqStack_IsEmpty(Manager))
{
printf("SeqStack is Empty!\n");
return 0;
}
// 2.由于删除了一个元素,则需要让顺序栈的栈顶元素下标-1
temp = Manager->Bottom[Manager->Top--];
return temp;
}
遍历顺序表的元素
void SeqStack_Print(SeqStack_t *Manager)
{
for (int i = 0; i <= Manager->Top; ++i)
{
printf(" Stack Element[%d] = %d\n", i, Manager->Bottom[i]);
}
}
int main(int argc, char const *argv[])
{
// 创建新的顺序栈,容量设置为10000
SeqStack_t *Manager = SeqStack_Create(10000);
int valur;
scanf("%d", &valur); // 标准输入一个整型数据
while (valur > 15) // 当数据大于15 进入循环体
{
SeqStack_Push(Manager, valur % 16); // 当数据大于15时 将数据对16取余,得到十六进制的最低位,入栈
valur /= 16; // 数据对16进行除法赋值 判断是否大于15 不大于结束循环
}
if (valur < 16) // 更新后的数据小于16 直接进行入栈操作
{
SeqStack_Push(Manager, valur);
}
printf("0x");
for (int i = Manager->Top; i > -1; i--)
{
// 当栈内数据在0~9之间 直接整型输出
if (Manager->Bottom[i] >= 0 && Manager->Bottom[i] <= 9)
printf("%d", Manager->Bottom[i]);
// 不满足以上条件时 进行判断后按照十六进制字符输出
switch (Manager->Bottom[i])
{
case 10:
printf("%c", 'a');
break;
case 11:
printf("%c", 'b');
break;
case 12:
printf("%c", 'c');
break;
case 13:
printf("%c", 'd');
break;
case 14:
printf("%c", 'e');
break;
case 15:
printf("%c", 'f');
break;
}
// 输出一次,表示栈顶的数据自减运算一次
Manager->Top--;
}
printf("\n");
return 0;
}
测试结果如下
总结
顺序栈的构造原理与数组类似,不过默认习惯不允许随机访问及随机增删改查
与链表类似的是使用了结构体对其进行管理
当对顺序栈进行增删操作时,栈顶指针应当随着增删操作进行增加或减少
一定不允许越过栈顶元素访问靠近栈底元素!!!!!