利用顺序栈完成的作业题(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;
}

​ 个人思考:因为申请了堆内存,因此还得有一个释放堆空间的步骤。因此,可以采用同样的思路,利用数组进行设计,不涉及堆空间的操作,更为方便。此处是因为作业要求涉及顺序栈,才多了那么多的步骤。

​ 如有不足之处,敬请批评指正!

热门相关:龙皇武神   极品妖孽归来   极品妖孽归来   幻想世界大穿越   勇闯天涯