利用順序棧完成的作業題(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;
}
個人思考:因為申請了堆記憶體,因此還得有一個釋放堆空間的步驟。因此,可以採用同樣的思路,利用陣列進行設計,不涉及堆空間的操作,更為方便。此處是因為作業要求涉及順序棧,才多了那麼多的步驟。
如有不足之處,敬請批評指正!