堆栈所具备的后进先出的特性使得它在计算机领域中称为十分重要、也是应用十分普遍的数据结构之一。也就是说,实际应用中只要问题知足“后进先出”的原则,就可使用堆栈。好比说在编译和运行的过程当中,就须要利用堆栈进行语法检查(包括括号是否配对)和表达是求值。接下来咱们就来探讨编译过程当中计算机是如何对程序进行符号的匹配的。算法
问题描述
咱们都知道C语言的语法中,不少符号都是成对出现的,好比说“()”、“{ }”、“ 【】”、“<>”。或者说是这样的“ { < ( ) > } ”.
然而像这样 “{ < } >” 、 " { { } "、 “{}} ” 等都是不符合语法的,都是错误的。基本上全部的编译器都有检查符号匹配性的功能,那么他们是如何工做的呢?数据结构
问题分析
全部的程序均可以当作是字符串组成的,因此咱们能够将他们分红一个一个的字符,只须要将左右括号拿出来对比就好了,其余的字符能够不须要管。
例如一个字符串:" { while ( !Stack_Empty ( top ) ) }”框架
在这里插入图片描述函数
在这里
1对应6
2对应5
3对应4
只有他们相互匹配才能说不出语法问题。那么咱们该怎么作呢?oop
建立一个栈,而后一个一个读取字符串中全部的字符,遇到左括号将其压入栈中,遇到右括号则将栈中的栈顶元素出栈并进行匹配,不然跳过读取下一个字符。这个是一个大框架。
在这里插入图片描述在这里插入图片描述测试
那么咱们就得判断一个字符串中全部的符号是否匹配成功,有如下几点:spa
若是第一个读取的不是左括号则错误,直接返回并提示错误信息
若是读取的右括号与栈顶的左括号不匹配,直接返回并提示错误信息
若是读取完全部的字符串以后栈中还有多余未匹配的左括号,直接返回并提示错误信息
这就是简单的符号匹配的核心思想。code
算法框架blog
1 **************************************************** 2 判断是否为右括号 3 是:返回1 4 否:返回0 5 **************************************************** 6 int isRight(char ch) 7 { 8 int ret; 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 return ret; 22 }
1 *********************************************************************** 2 该函数用来判断左右符号是否匹配 3 是:返回1 4 否:返回0 5 *********************************************************************** 6 int check(char Left, char Right) 7 { 8 int ret; 9 switch (Left) 10 { 11 case'<': 12 if (Right == '>')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 return ret; 28 }
1 *********************************************************************** 2 该函数主要功能是读取字符串,调用判断左、右括号的函数,调用判断是否匹配的函数 3 判断是否栈中有剩余左括号 4 若是无错误:返回1 5 不然:返回0 6 *********************************************************************** 7 int scanner(char cost[]) 8 { 9 int i = 0; 10 int ret = 0; 11 Stack top = Stack_Inten(); 12 char ch; 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 return ret; 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<stdio.h> 2 #include <stdlib.h> 3 4 5 typedef struct Stack_operate 6 { 7 char ch; 8 struct Stack_operate* link; 9 }Sta, *Stack; 10 11 12 Stack Stack_Inten(); 13 int Stack_Empty(Stack); 14 int Stack_Len(Stack); 15 Stack Stack_Push(Stack , char ); 16 Stack Stack_Pull(Stack , char *); 17 int Stack_Free(Stack ); 18 int isLeft(char ); 19 int isRight(char ); 20 int check(char , char ); 21 int scanner(char cost[]); 22 void panduan(int );
函数定义
1 #include"check.h" 2 3 Stack Stack_Inten() 4 { 5 return NULL; 6 } 7 8 9 int Stack_Empty(Stack top) 10 { 11 return(top == NULL); 12 } 13 14 15 16 int Stack_Len(Stack top) 17 { 18 int i = 0; 19 while (top != NULL) 20 { 21 top = top->link; 22 i++; 23 } 24 return i; 25 } 26 27 28 Stack Stack_Push(Stack top, char ch) 29 { 30 Stack p; 31 p = (Stack)malloc(sizeof(Sta)); 32 p->ch = ch; 33 p->link = top; 34 top = p; 35 return top; 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 return top; 48 } 49 50 51 int Stack_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(char ch) 66 { 67 int ret; 68 switch (ch) 69 { 70 case '<': 71 case'(': 72 case'[': 73 case'{': 74 ret = 1; 75 break; 76 default: 77 ret = 0; 78 break; 79 } 80 return ret; 81 } 82 83 84 int isRight(char ch) 85 { 86 int ret; 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 return ret; 100 } 101 102 103 int check(char Left, char Right) 104 { 105 int ret; 106 switch (Left) 107 { 108 case'<': 109 if (Right == '>')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 return ret; 125 } 126 127 128 int scanner(char cost[]) 129 { 130 int i = 0; 131 int ret = 0; 132 Stack top = Stack_Inten(); 133 char ch; 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 return ret; 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(int i) 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<<jlksjfio>{}"; 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