P51 例3-3 假设一个算数表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个函数,用来判别表达式中的括号是否正确匹配,并设计一个测试主函数。

    科技2025-07-16  14

    P51 例3-3 假设一个算数表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个函数,用来判别表达式中的括号是否正确匹配,并设计一个测试主函数。

    头文件:SeqStack.h

    #include<stdio.h> #include<string.h> #define MaxStackSize 100 typedef char DataType; typedef struct { DataType stack[MaxStackSize]; int top; }SeqStack; void StackInitiate(SeqStack *S) { S->top=0; } int StackNotEmpty(SeqStack S) { if(S.top<=0) return 0; else return 1; } int StackPush(SeqStack *S,DataType x) { if(S->top>=MaxStackSize) { printf("堆栈已满无法插入!\n"); return 0; } else { S->stack[S->top]=x; S->top++; return 1; } } int StackPop(SeqStack *S,DataType *d) { if(S->top<=0) { printf("堆栈已空无数据元素出栈!\n"); return 0; } else { S->top--; *d=S->stack[S->top]; return 1; } } int StackTop(SeqStack S,DataType *d) { if(S.top<=0) { printf("堆栈已空!\n"); return 0; } else { *d=S.stack[S.top-1]; return 1; } }

    源文件:SeqStack.c

    #include"SeqStack.h" void ExpIsCorrect(char exp[], int n) { SeqStack myStack; int i; char c; StackInitiate(&myStack); for (i = 0; i < n; i++) { if ((exp[i] == '(') || (exp[i] == '[') || (exp[i] == '{')) StackPush(&myStack, exp[i]); else if (exp[i] == ')' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c == '(') StackPop(&myStack, &c); else if (exp[i] == ')' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c != '(') { printf("左右括号配对次序不正确!\n"); return; } else if (exp[i] == ']' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c == '[') StackPop(&myStack, &c); else if (exp[i] == ']' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c != '[') { printf("左右括号配对次序不正确!\n"); return; } else if (exp[i] == '}' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c == '{') StackPop(&myStack, &c); else if (exp[i] == '}' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c != '{') { printf("左右括号配对次序不正确!\n"); return; } else if (((exp[i] == ')') || (exp[i] == ']') || (exp[i] == '}')) && !StackNotEmpty(myStack)) { printf("右括号多于左括号!\n"); return; } } if (StackNotEmpty(myStack)) printf("左括号多于右括号!\n"); else printf("左右括号匹配正确!\n"); } int main() { char a[] = "(())abc{[]()}"; char b[] = "(()))abc{[]}"; char c[] = "(()()abc{[]}"; char d[] = "(())abc{[]}"; int n1 = (int)strlen(a); int n2 = (int)strlen(b); int n3 = (int)strlen(c); int n4 = (int)strlen(d); ExpIsCorrect(a, n1); ExpIsCorrect(b, n2); ExpIsCorrect(c, n3); ExpIsCorrect(d, n4); return 0; }
    Processed: 0.011, SQL: 8