堆栈所具备的后进先出的特性使得它在计算机领域中称为十分重要、也是应用十分普遍的数据结构之一。也就是说,实际应用中只要问题知足“后进先出”的原则,就可使用堆栈。好比说在编译和运行的过程当中,就须要利用堆栈进行语法检查(包括括号是否配对)和表达是求值。接下来咱们就来探讨编译过程当中计算机是如何对程序进行符号的匹配的。算法
问题描述
咱们都知道C语言的语法中,不少符号都是成对出现的,好比说“()”、“{ }”、“ 【】”、“<>”。或者说是这样的“ { < ( ) > } ”.
然而像这样 “{ < } >” 、 " { { } "、 “{}} ” 等都是不符合语法的,都是错误的。基本上全部的编译器都有检查符号匹配性的功能,那么他们是如何工做的呢?数据结构
问题分析
全部的程序均可以当作是字符串组成的,因此咱们能够将他们分红一个一个的字符,只须要将左右括号拿出来对比就好了,其余的字符能够不须要管。
例如一个字符串:" { while ( !Stack_Empty ( top ) ) }”框架
在这里插入图片描述函数
在这里
1对应6
2对应5
3对应4
只有他们相互匹配才能说不出语法问题。那么咱们该怎么作呢?oop
建立一个栈,而后一个一个读取字符串中全部的字符,遇到左括号将其压入栈中,遇到右括号则将栈中的栈顶元素出栈并进行匹配,不然跳过读取下一个字符。这个是一个大框架。
在这里插入图片描述在这里插入图片描述测试
那么咱们就得判断一个字符串中全部的符号是否匹配成功,有如下几点:spa
若是第一个读取的不是左括号则错误,直接返回并提示错误信息
若是读取的右括号与栈顶的左括号不匹配,直接返回并提示错误信息
若是读取完全部的字符串以后栈中还有多余未匹配的左括号,直接返回并提示错误信息
这就是简单的符号匹配的核心思想。code
算法框架blog
1 ****************************************************
2 判断是否为右括号3 是:返回14 否:返回05 ****************************************************
6 int isRight(charch)7 {8 intret;9 switch(ch)10 {11 case']':12 case'}':13 case')':14 case'>':15 ret = 1;16 break;17 default:18 ret = 0;19 break;20 }21 returnret;22 }
1 ***********************************************************************
2 该函数用来判断左右符号是否匹配3 是:返回14 否:返回05 ***********************************************************************
6 int check(char Left, charRight)7 {8 intret;9 switch(Left)10 {11 case'')ret = 1;13 break;14 case'[':15 if (Right == ']')ret = 1;16 break;17 case'{':18 if (Right == '}')ret = 1;19 break;20 case'(':if (Right == ')')ret = 1;21 break;22 default:23 ret = 0;24 break;25
26 }27 returnret;28 }
1 ***********************************************************************
2 该函数主要功能是读取字符串,调用判断左、右括号的函数,调用判断是否匹配的函数3 判断是否栈中有剩余左括号4 若是无错误:返回15 不然:返回06 ***********************************************************************
7 int scanner(charcost[])8 {9 int i = 0;10 int ret = 0;11 Stack top =Stack_Inten();12 charch;13 while (cost[i] != '\0')14 {15
16 if(isLeft(cost[i]))17 top =Stack_Push(top, cost[i]);18 if(isRight(cost[i]))19 {20 if (top ==NULL)21 return (ret = 0);22 else
23 {24 top = Stack_Pull(top, &ch);25 if (!(ret =check(ch, cost[i])))26 returnret;27 }28 }29 i++;30 }31 if (!Stack_Empty(top))32 {33 Stack_Free(top);34 return (ret = 0);35 }36 return (ret = 1);37 }
总的测试代码(包含栈)图片
头文件“check.h”
1 #include
2 #include
3
4
5 typedef structStack_operate6 {7 charch;8 struct Stack_operate*link;9 }Sta, *Stack;10
11
12 Stack Stack_Inten();13 intStack_Empty(Stack);14 intStack_Len(Stack);15 Stack Stack_Push(Stack , char);16 Stack Stack_Pull(Stack , char *);17 intStack_Free(Stack );18 int isLeft(char);19 int isRight(char);20 int check(char , char);21 int scanner(charcost[]);22 void panduan(int );
函数定义
1 #include"check.h"
2
3 Stack Stack_Inten()4 {5 returnNULL;6 }7
8
9 intStack_Empty(Stack top)10 {11 return(top ==NULL);12 }13
14
15
16 intStack_Len(Stack top)17 {18 int i = 0;19 while (top !=NULL)20 {21 top = top->link;22 i++;23 }24 returni;25 }26
27
28 Stack Stack_Push(Stack top, charch)29 {30 Stack p;31 p = (Stack)malloc(sizeof(Sta));32 p->ch =ch;33 p->link =top;34 top =p;35 returntop;36 }37
38
39
40 Stack Stack_Pull(Stack top, char *p_ch)41 {42 Stack p;43 *p_ch = top->ch;44 p =top;45 top = top->link;46 free(p);47 returntop;48 }49
50
51 intStack_Free(Stack top)52 {53 Stack p;54
55 while (top !=NULL)56 {57 p =top;58 top = top->link;59 free(p);60 }61 return 1;62 }63
64
65 int isLeft(charch)66 {67 intret;68 switch(ch)69 {70 case '
83
84 int isRight(charch)85 {86 intret;87 switch(ch)88 {89 case']':90 case'}':91 case')':92 case'>':93 ret = 1;94 break;95 default:96 ret = 0;97 break;98 }99 returnret;100 }101
102
103 int check(char Left, charRight)104 {105 intret;106 switch(Left)107 {108 case'')ret = 1;110 break;111 case'[':112 if (Right == ']')ret = 1;113 break;114 case'{':115 if (Right == '}')ret = 1;116 break;117 case'(':if (Right == ')')ret = 1;118 break;119 default:120 ret = 0;121 break;122
123 }124 returnret;125 }126
127
128 int scanner(charcost[])129 {130 int i = 0;131 int ret = 0;132 Stack top =Stack_Inten();133 charch;134 while (cost[i] != '\0')135 {136
137 if(isLeft(cost[i]))138 top =Stack_Push(top, cost[i]);139 if(isRight(cost[i]))140 {141 if (top ==NULL)142 return (ret = 0);143 else
144 {145 top = Stack_Pull(top, &ch);146 if (!(ret =check(ch, cost[i])))147 returnret;148 }149 }150 i++;151 }152 if (!Stack_Empty(top))153 {154 Stack_Free(top);155 return (ret = 0);156 }157 return (ret = 1);158 }159
160 void panduan(inti)161 {162 if (i = 1)163 puts("Right!!!!!");164 else
165 puts("Error!!!!!");166 }
主函数等
1 int main(void)2 {3 int ret1 = 0;4 int ret2 = 0;5 char cost1[] = "the bookis< kkko,(slkj(sfd)sdg)agds{}>";6 char cost2[] = "lkdjfklajg<{}";7
8 ret1 =scanner(cost1);9 ret2 =scanner(cost2);10
11 puts("The first string is:");12 panduan(ret1);13 puts("The second string is:");14 panduan(ret2);15
16 return 0;17 }
最终结果啦
这个算法到这里就算是结束了。
嗝~
csdn中同步更新:codeloop