資料結構演算法題

沉舟道人發表於2024-04-25

資料結構演算法題

透過鍵盤輸入一個包括 '(' 和 ')' 的字串string ,判斷字串是否有效。要求設計演算法實現檢查字串是否有效,有效的字串需滿足以下條件:

A.左括號必須用相同型別的右括號閉合。
B.左括號必須以正確的順序閉合。
C.每個右括號都有一個對應的相同型別的左括號。

思路:

image

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;
}

測試輸出結果
image

相關文章