資料結構演算法題
透過鍵盤輸入一個包括 '(' 和 ')' 的字串string ,判斷字串是否有效。要求設計演算法實現檢查字串是否有效,有效的字串需滿足以下條件:
A.左括號必須用相同型別的右括號閉合。
B.左括號必須以正確的順序閉合。
C.每個右括號都有一個對應的相同型別的左括號。
思路:
1.遍歷字串
2.建立連結串列
2。當遇到左括號存入連結串列,當遇到右括號左括號出棧
3.當出棧時檢查到連結串列為空說明右括號多了,順序不對,語法錯誤
4.當遍歷完成之後,連結串列為空說明括號是配對的,字串有效,否則說明左括號多了,字串無效。
程式碼段
1.遍歷字串函式
/**********************************************************************************************
* func name : StrCheck
* function : Check whether string's bracket is right
* func parameter :
* @str :string to be checked
* @Head :address of head node
* return resuolt : Check result (true or false)
* author : liaojx2016@126.com
* date : 2024/04/25
* note : None
* modify history : None
* function section: v1.0
*
**********************************************************************************************/
bool StrCheck(char *str,StackLList_t *head)
{
bool flag=1; //定義一個標誌,用於返回檢查結果
//遍歷字元,找出括號
while (*str)
{
//當字元為左括號,將其存入連結串列
if (*str=='(') {
Stack_Push(*str,head);
}
//當字元為右括號,出棧
if (*str==')') {
flag=Stack_Pop(head);
}
//當連結串列中沒有結點,且字元為右括號,字串語法錯誤,結束函式並返回0
if (flag==0) {
return false;
}
str++;
}
//遍歷完字串之後,判斷連結串列是否為空,若為空,表示語法正確,flag置1,若非空,則語法錯誤,flag置0。
flag=Stack_IsEmpty(head);
return flag;
}
2.入棧函式
/**********************************************************************************************
* func name : StackLList_Push
* function : Do stack push for left bracket
* func parameter :
* @ch :Push charactor to stack
* @Head :Address of head node
* return resuolt : Stack push success result (true or false)
* author : liaojx2016@126.com
* date : 2024/04/25
* note : None
* modify history : None
* function section: v1.0
*
**********************************************************************************************/
bool Stack_Push(char ch,StackLList_t *Head)
{
//1.建立新的結點,並對新結點進行初始化
StackLList_t *New = StackLList_NewNode(ch);
if (NULL == New)
{
printf("can not insert new node\n");
return false;
}
//2.判斷連結串列是否為空,如果為空,則直接插入即可
if (NULL == Head->next)
{
Head->next = New;
return true;
}
//3.如果連結串列為非空,則把新結點插入到連結串列的頭部
New->next = Head->next;
Head->next = New;
return true;
}
3.出棧函式
/**********************************************************************************************
* func name : Stack_Pop
* function : Stack pop for one charactor
* func parameter :
* @Head :address of head node
* return resuolt : Stack pop success result (true or false)
* author : liaojx2016@126.com
* date : 2024/04/25
* note : None
* modify history : None
* function section: v1.0
*
**********************************************************************************************/
bool Stack_Pop(StackLList_t *Head)
{
//當連結串列為空,刪除失敗,返回false
if (NULL == Head->next)
{
//printf("Stack linklist is empty\n");
return false;
}
StackLList_t *Delnode=Head->next; //備份首結點
//printf("next=%#x\n",Head->next->next);
//printf("the push element data is %d\n",Head->next->ch);
//首部刪除一個節點
Head->next=Head->next->next;
Delnode->next=NULL;
free(Delnode);
return true;
}
4.判斷連結串列為空
/**********************************************************************************************
* func name : Stack_IsEmpty
* function : Judge whether stack is empty
* func parameter :
* @Head :address of head node
* return resuolt : Check stack empty result (if empty,reture true.if not return false)
* author : liaojx2016@126.com
* date : 2024/04/25
* note : None
* modify history : None
* function section: v1.0
*
**********************************************************************************************/
bool Stack_IsEmpty(StackLList_t *head)
{
if (head->next==NULL)
return true;
else
return false;
}
5.主函式
int main(int argc, char const *argv[])
{
char *str="(j(k)ld)fd(((&)))))";
//建立一個連結串列,儲存左括號
StackLList_t *head=StackLList_Create();
printf("the words is %s\n",str);
//判斷字串的括號是否符合語法
//當檢查函式返回1,則字串語法正確,否則輸出語法錯誤
if (1==StrCheck(str,head)) {
printf("the words is valid! \n");
}
else
printf("the words is not valid!!!\n");
return 0;
}
測試輸出結果