堆栈所具有的后进先出的特性使得它在计算机领域中称为十分重要、也是应用十分广泛的数据结构之一。也就是说,实际应用中只要问题满足“后进先出”的原则,就可以使用堆栈。比如说在编译和运行的过程中,就需要利用堆栈进行语法检查(包括括号是否配对)和表达是求值。接下来我们就来探讨编译过程中计算机是如何对程序进行符号的匹配的。
问题描述
我们都知道C语言的语法中,很多符号都是成对出现的,比如说“()”、“{ }”、“ 【】”、“<>”。或者说是这样的“ { < ( ) > } ”.
然而像这样 “{ < } >” 、 " { { } "、 “{}} ” 等都是不符合语法的,都是错误的。基本上所有的编译器都有检查符号匹配性的功能,那么他们是如何工作的呢?
问题分析
所有的程序都可以看成是字符串组成的,所以我们可以将他们分成一个一个的字符,只需要将左右括号拿出来对比就行了,其他的字符可以不需要管。
例如一个字符串:" { while ( !Stack_Empty ( top ) ) }”
在这里
1对应6
2对应5
3对应4
只有他们相互匹配才能说不出语法问题。那么我们该怎么做呢?
创建一个栈,然后一个一个读取字符串中所有的字符,遇到左括号将其压入栈中,遇到右括号则将栈中的栈顶元素出栈并进行匹配,否则跳过读取下一个字符。这个是一个大框架。
那么我们就得判断一个字符串中所有的符号是否匹配成功,有以下几点:
- 如果第一个读取的不是左括号则错误,直接返回并提示错误信息
- 如果读取的右括号与栈顶的左括号不匹配,直接返回并提示错误信息
- 如果读取完所有的字符串之后栈中还有多余未匹配的左括号,直接返回并提示错误信息
这就是简单的符号匹配的核心思想。
算法框架
***********************************************************************
该函数用来判断是否为左括号
如果是:返回1
否则:返回0
***********************************************************************
int isLeft(char ch)
{
int ret;
switch (ch)
{
case '<':
case'(':
case'[':
case'{':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
***********************************************************************
判断是否为右括号
是:返回1
否:返回0
*************