利用顺序栈完成的作业题(C语言)
利用顺序栈完成的作业题(C语言)
/**
* @file name:
1. 使用顺序栈设计一个把十进制数转换为十六进制数的接口
2. 输入包括 '(' 和 ')' 的字符串string ,判断括号的合法性
* @brief
* @author ni456xinmie@163.com
* @date 2024/04/25
* @version 1.0 :
* @property :
* @note
* CopyRight (c) 2023-2024 ni456xinmie@163.com All Right Reseverd
*/
题目一
设计一个进制转换程序,使用顺序栈设计一个把十进制数转换为十六进制数的接口,实现当通过键盘输入一个非负的十进制数,可以在终端输出对应的十六进制数。
// 指的是16进制的位数,如果用户输入的数字比较大,可以根据需要进行修改
#define SIZE 8
// 构造记录顺序栈SequenceStack各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
typedef struct SequenceStack
{
char *Bottom; // 记录栈底地址,char类型字符长度足够存放一位十六进制数字
unsigned int Size; // 记录栈容量
int Top; // 记录栈顶元素的下标
} SeqStack_t;
void *SeqStack_Hex(int Data)
{
SeqStack_t *Manager = (SeqStack_t *)calloc(1, sizeof(SeqStack_t));
// 1.利用calloc为顺序栈的管理结构体申请一块堆内存,并进行判断
if (NULL == Manager)
{
perror("calloc memory for manager is failed");
exit(-1); // 程序异常终止
}
Manager->Bottom = (DataType_t *)calloc(SIZE, sizeof(DataType_t));
// 2.利用calloc为所有元素申请堆内存,并进行判断
if (NULL == Manager->Bottom)
{
perror("calloc memory for Stack is failed");
free(Manager);
exit(-1); // 程序异常终止
}
// 3.对管理顺序栈的结构体进行初始化(元素容量 + 最后元素下标)
Manager->Size = SIZE; // 对顺序栈中的容量进行初始化
Manager->Top = -1; // 由于顺序栈为空,则栈顶元素的下标初值为-1
while (Data)//将用户输入的数值用作判定条件,为0时退出
{
Manager->Bottom[++Manager->Top] = Data % 16;//将余数存放,作为转换后的低位数
Data = Data / 16;
}
while (Manager->Top != -1)
{
printf("%X", Manager->Bottom[Manager->Top--]);//从栈顶开始输出转换后的数
}
Manager->Bottom == NULL;
free(Manager);
free(Manager->Bottom);//释放栈空间
return;
}
主函数,测试上述程序:
int main(int argc, char const *argv[])
{
int a;
printf("Input a decimal number:");
scanf("%d", &a);
SeqStack_Hex(a);
return 0;
}
题目二
通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:
A. 左括号必须用相同类型的右括号闭合。
B. 左括号必须以正确的顺序闭合。
C. 每个右括号都有一个对应的相同类型的左括号。
#define SIZE 20 // 指的是一次性输入的字符串长度,用户可以根据需要进行修改
// 构造记录顺序栈SequenceStack各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
typedef struct SequenceStack
{
char *Bottom; // 记录栈底地址,用来存放‘(’和‘)’。
unsigned int Size; // 记录栈容量,即字符串的最大长度
int Top; // 记录栈顶元素的下标
} SeqStack_t;
bool SeqStack_Judge(DataType_t *arr)
{
SeqStack_t *Manager = (SeqStack_t *)calloc(1, sizeof(SeqStack_t)); // 1.利用calloc为顺序栈的管理结构体申请一块堆内存,并进行判断
if (NULL == Manager)
{
perror("calloc memory for manager is failed");
exit(-1); // 程序异常终止
}
Manager->Bottom = (DataType_t *)calloc(SIZE, sizeof(DataType_t)); // 2.利用calloc为所有元素申请堆内存,并进行判断
if (NULL == Manager->Bottom)
{
perror("calloc memory for Stack is failed");
free(Manager);
exit(-1); // 程序异常终止
}
// 3.对管理顺序栈的结构体进行初始化(元素容量 + 最后元素下标)
Manager->Size = SIZE; // 对顺序栈中的容量进行初始化
Manager->Top = -1; // 由于顺序栈为空,则栈顶元素的下标初值为-1
while (*arr) // 将arr的元素作为判断条件,当字符串全部输入结束时可以结束
{
if (*arr == '(')
{
Manager->Bottom[++Manager->Top] = 1; // 将’(‘放入栈中
}
else if (*arr == ')') // 将‘)’出栈
{
Manager->Top--;
if (Manager->Top < -1) // 当’)‘出栈过多,即左边的括号为)时候,判定为无效
{
printf("It's a invalid string.\n");
return false;
}
}
arr++;
}
if (Manager->Top != -1) // 当Manager->Top=-1时,表示’(‘和‘)’数量相等,不然的话判定为无效
{
printf("It's a invalid string.\n");//无效字符串书判定
}
else
{
printf("It's a valid string.\n");//有效字符串书判定
}
free(Manager);
free(Manager->Bottom);
return true;
}
主函数,测试上述程序:
int main(int argc, char const *argv[])
{
DataType_t arr[SIZE];
printf("Input a string:");
scanf("%s", arr);
SeqStack_Judge(arr);
return 0;
}
个人思考:因为申请了堆内存,因此还得有一个释放堆空间的步骤。因此,可以采用同样的思路,利用数组进行设计,不涉及堆空间的操作,更为方便。此处是因为作业要求涉及顺序栈,才多了那么多的步骤。
如有不足之处,敬请批评指正!