话不多说 先上代码
#include<stdio.h> #include<malloc.h> #define MaxSize 100 typedef struct node { char data; struct node* next; }LinkNode; typedef struct { char data[MaxSize]; int top; }SqStack; void CreateList(LinkNode*& L);//输入表达式 void InitStack(SqStack*& s);//初始化顺序栈 void DestroyStack(SqStack*& s);//销毁顺序栈 bool StackEmpty(SqStack* s);//判断栈空否 bool Push(SqStack*& s, char e);//进栈 bool Pop(SqStack*& s);//出栈 int num(char ch);//括号数字化 int compare(int n1, int n2);//优先级比较 void function(LinkNode*& L, SqStack*& s); void kuohao(LinkNode*& L);//输出括号匹配 int main() { LinkNode* L; SqStack* s; InitStack(s); printf("请输入您的表达式:\n"); CreateList(L); function(L, s); printf("\n括号匹配结果如下:\n"); kuohao(L); return 0; } //核心代码 void function(LinkNode*& L, SqStack *&s) { LinkNode* p; p = L->next; while (p != NULL) //首先扫一遍字符串 { if (p->data == '(' || p->data == '[' || p->data == '{') { if (!StackEmpty(s)) //判断是否为空栈 { Push(s, p->data); } //满足括号优先级比栈顶小的就入栈 else if(!compare(num(p->data), num(s->data[s->top]))) { Push(s, p->data); } else { printf("括号匹配不正确"); return; } } if (p->data == ')' || p->data == ']' || p->data == '}') { if(StackEmpty(s)) //如果空栈先遇到了右括号,则直接停止运行 { if (num(p->data) + num(s->data[s->top]) == 10) { Pop(s); } else { printf("括号匹配不正确"); return; } } else { printf("括号匹配不正确");return; //疑问?? 这里为什么要加上括号 单语句可以不用加括号啊 } //不加括号输不出来 求大神请教 } p = p->next; } if (!StackEmpty(s)) //扫完表达式之后观察栈中是否有括号 printf("括号匹配正确"); else printf("括号匹配不正确"); } void CreateList(LinkNode*& L) { LinkNode* s, * r; char ch; L = (LinkNode*)malloc(sizeof(LinkNode)); L->next = NULL; r = L; while (true) { s = (LinkNode*)malloc(sizeof(LinkNode)); scanf("%c", &ch); if (ch == '\n') break; s->data = ch; r->next = s; r = s; } r->next = NULL; } //初始化顺序栈 void InitStack(SqStack*& s) { s = (SqStack*)malloc(sizeof(SqStack)); s->top = -1; } //销毁顺序栈 void DestroyStack(SqStack*& s) { free(s); } //判断栈空否 bool StackEmpty(SqStack* s) { if (s->top == -1) { return false; } else { return true; } } //进栈 bool Push(SqStack*& s,char e) { if (s->top == MaxSize - 1) return false; s->top++; s->data[s->top] = e; return true; } //出栈 bool Pop(SqStack*& s) { if (s->top == -1) return false; s->top--; return true; } //括号数字化 int num(char ch) { switch (ch) { case '(':return 1; case '[':return 2; case '{':return 3; case ')':return 9; case ']':return 8; case '}':return 7; } } //优先级比较 int compare(int n1, int n2) { return n1 > n2 ? 1 : 0; } //输出括号匹配 void kuohao(LinkNode*& L) { LinkNode* p; p = L->next; while (p != NULL) { if (p->data == '(' || p->data == '[' || p->data == '{' || p->data == ')' || p->data == ']' || p->data == '}') { printf("%c", p->data); } p = p->next; } }
问题是 () {} []三种括号的匹配,注意之间的顺序,优先级{}>[]>()。设计算法匹配括号
输入表达式要注意输入英文括号,而不是中文括号!!!
具体思路见代码!!!
最后代码可能会有点复杂,希望大家能够多提提建议。非常感谢!!