c语言匹配符号意义,栈应用举例之符号匹配检查(C语言)

堆栈所具备的后进先出的特性使得它在计算机领域中称为十分重要、也是应用十分普遍的数据结构之一。也就是说,实际应用中只要问题知足“后进先出”的原则,就可使用堆栈。好比说在编译和运行的过程当中,就须要利用堆栈进行语法检查(包括括号是否配对)和表达是求值。接下来咱们就来探讨编译过程当中计算机是如何对程序进行符号的匹配的。算法

问题描述

咱们都知道C语言的语法中,不少符号都是成对出现的,好比说“()”、“{ }”、“ 【】”、“<>”。或者说是这样的“ { < ( ) > } ”.

然而像这样 “{ < } >” 、 " { { } "、 “{}} ” 等都是不符合语法的,都是错误的。基本上全部的编译器都有检查符号匹配性的功能,那么他们是如何工做的呢?数据结构

问题分析

全部的程序均可以当作是字符串组成的,因此咱们能够将他们分红一个一个的字符,只须要将左右括号拿出来对比就好了,其余的字符能够不须要管。

例如一个字符串:" { while ( !Stack_Empty ( top ) ) }”框架

在这里插入图片描述函数

c67184bde3af0c4253a050c7a30d6181.png

在这里

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 }

最终结果啦

82e267b754fe62b0c7c0aa113fe2ce32.png

这个算法到这里就算是结束了。

嗝~

csdn中同步更新:codeloop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值