/***********************************
日期: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.既然是遞迴,無非也就是棧,這裡,我們將第一層做個標...