判斷括號是否匹配

2021-04-29 20:12:03 字數 1482 閱讀 7696

/***********************************

日期:2009.6.20

************************************/

問題:設計乙個演算法,判斷乙個算術表示式中的括號是否配對。算術表示式儲存在帶頭結點的單迴圈鍊錶中,每個結點有兩個域:ch和

link

,其中ch

域為字元型別。

1、思路:根據括號的特點

( ( ) )

,進行匹配的時候,第乙個做括號最後乙個匹配,最後乙個左括號與第乙個右括號相匹配,恰好可以使用棧來進行儲存。

2、方法:先把表示式放在鍊錶中,然後讀取鍊錶,當遇見左括號時,把「(

」入棧,遇見「)

」時進行出棧,直到棧空或者鍊錶結束。

3、在進行檢測括號是否匹配的時候,需要考慮到各種情況:

1)、匹配。

例如:(())

2)、左括號不匹配。例如:

(()3

)、右括號不匹配。例如:

())4

、判斷上述幾種情況的方式:

1)左括號不匹配:當鍊表讀取結束的時候,檢測棧為不為空。

2)右括號不匹配:當棧為空,而鍊錶中還存在「)

」。3)括號匹配:當棧為空,並且讀取鍊錶結束。

5、建立鍊錶需要注意的問題:

在本題中採用迴圈鍊錶,判斷迴圈鍊錶是否結束的條件是:末指標是否等於頭指標。

為了防止在表示式中的最後乙個字元是「)

」而導致程式出現意外情況,再建立迴圈鍊錶的時候,在末節點增加乙個填充節點。

#include

#include

typedef struct node

node;

typedef struct stack

stack;

node* initnode()

p=(node*) malloc(sizeof(node));

p->data='?';

q->next=p;

q=p;

q->next=head;

return head;

}stack* initstack()

stack *pushstack(stack *top,char c)

stack *popstack(stack *top)

int main(int argc, char *argv)

if(p->data==')')

p=p->next;

}printf("匹配結束,結果為/n");

if(pstack!=stacktop)

printf("左括號不匹配/n");

else

if(p->next!=pnode)

printf("右括號不匹配/n");

else

printf("括號匹配/n");

system("pause"); 

return 0;

}

判斷括號是否匹配 堆疊

1.有效的括號 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示...

利用棧判斷括號是否匹配

輸入格式如下 3 輸出格式如下 yes no yes 演算法描述 利用棧來判斷 注意出棧時,考慮棧是否為空 最後匹配的結果應該是棧為空 1 從左到右進行掃瞄字元 2 若為左括號 else public boolean isbalanced string str elseelseelse end fo...

使用純遞迴判斷括號是否匹配

判斷括號大家可能都會,無非就是進棧出棧的問題,但是我們一般都會顯式的定義乙個棧,一般就是乙個陣列,現在有乙個問題,要求不能使用顯示棧,不能用陣列,甚至不能用指標,當然也不能用stl,就使用純遞迴,而且包含三種括號,怎麼做呢?這裡,我提供一種思路 1.既然是遞迴,無非也就是棧,這裡,我們將第一層做個標...