利用順序棧完成的作業題(C語言)

Rice_rice發表於2024-04-25

利用順序棧完成的作業題(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;
}

​ 個人思考:因為申請了堆記憶體,因此還得有一個釋放堆空間的步驟。因此,可以採用同樣的思路,利用陣列進行設計,不涉及堆空間的操作,更為方便。此處是因為作業要求涉及順序棧,才多了那麼多的步驟。

​ 如有不足之處,敬請批評指正!

相關文章