棧的應用之檢測括號合法性
阿新 • • 發佈:2019-02-15
#include<stdio.h> #include"linkstack.h" int isLeft(char c) { int ret = 0; switch (c) { case '<': case '(': case '[': case '{': case '\'': case '\"': ret = 1; break; default: ret = 0; break; } return ret; } int isRight(char c) { int ret = 0; switch (c) { case '>': case ')': case ']': case '}': case '\'': case '\"': ret = 1; break; default: ret = 0; break; } return ret; } int isMatch(char left, char right) { int ret = 0; switch (left) { case '<': ret = (right == '>'); break; case '(': ret = (right == ')'); break; case '[': ret = (right == ']'); break; case '{': ret = (right == '}'); break; case '\'': ret = (right == '\''); break; case '\"': ret = (right == '\"'); break; default: break; } return ret; } void printErr(char right) { switch (right) { case '>': printf("缺少一個<\n"); break; case ')': printf("缺少一個(\n"); break; case ']': printf("缺少一個[\n"); break; case '}': printf("缺少一個{\n"); break; case '\'': printf("缺少一個\'\n"); break; case '\"': printf("缺少一個\"\n"); break; default: break; } } void Scaner(const char *c) { LinkStack *stack = LinkStack_Create(); int i = 0; while (c[i] != '\0') { if (isLeft(c[i])) { LinkStack_Push(stack, (void *)(c+i));//若是左括號,則入棧 } if (isRight(c[i])) { char *pop = (char *)LinkStack_Pop(stack);//若是右括號則與棧頂括號比較 if (pop == NULL || !isMatch(*pop, c[i])) { printErr(c[i]); break; } } i++; } if (LinkStack_Size(stack) == 0 && c[i] == '\0') { printf("Success!\n"); } else { printf("invilod code\n"); } LinkStack_Destroy(stack); } void main() { //char *c = "void main() char a[6]; while{ if(a[1]==0) printf(\"Success!\\n\");"; const char *c = "([);"; Scaner(c); }