棧的實驗的括號匹配問題
阿新 • • 發佈:2020-09-14
實驗內容
算術表示式中右括號和左括號匹配的次序正好符合後到括號要最先被匹配的“後進先出”堆疊操作特點,因此可以借用一個堆疊來進行判斷。
具體方法:
⑴ 順序掃描算術表示式(表現為一個字串);
⑵ 當遇到三種類型的左括號時,讓該括號進棧;
⑶ 當遇到某一種型別的右括號時,比較當前棧頂括號是否與之匹配,
⑷ 若匹配則退棧,轉(1)繼續進行判斷;
⑸ 若不匹配,則左右括號配對次序不正確,結束。
⑹ 若字串當前為某一型別的右括號而堆疊為空,則右括號多於左括號,結束。
⑺ 若字串掃描結束而堆疊非空,則左括號多於右括號,結束。
⑻ 若字串掃描結束而堆疊為空,則左右括號匹配正確,結束。
#include <stdio.h> #include <stdlib.h> #define bool int #define true 1 #define false 0 typedef struct stack { char* top; char* base; int MaxStack; }sqstack; int initstack(sqstack* S) { S->base = (char*)malloc(sizeof(int) * 100); if (S->base) { S->top = S->base; } return 0; } int pushstack(sqstack* S, char a) { *(S->top++) = a; return 0; } int popstack(sqstack* S) { int e = *(--S->top); return e; } bool empty(sqstack* S) { if (S->base == S->top) { return false; } return true; } int main() { sqstack S;int flag = 1; int i = 0; initstack(&S); char c[100]; fgets(c, 100, stdin); if (c[i] == '(' || c[i] == '[' || c[i] == '{') { pushstack(&S, c[i]); } else if (c[i] == ')' || c[i] == '}' || c[i] == ']') { flag = 0; printf("%d", flag); return flag; } i++; while (c[i] != '\0') { if (c[i] == '(' || c[i] == '[' || c[i] == '{') { pushstack(&S, c[i]); } else if (c[i] == ')' || c[i] == '}' || c[i] == ']') { if (empty(&S) == true) { char c1 = popstack(&S); if (!((c1 == '(' && c[i] == ')') || (c1 == '{' && c[i] == '}') || (c1 == '[' && c[i] == ']'))) { flag = 0; printf("%d", flag); return flag; } } else { flag = 0; printf("%d", flag); return flag; } } i++; } printf("%d", flag); return flag; }
好了,我們下回見,peace