栈的应用-平衡符号(C版)

编译器检查程序的语法错误,比如括号是否成对出现。

基本思想:做一个空栈。读入字符直到文件结尾,如果字符是一个开放符号,将其入栈。如果是一个封闭符号,则当栈空时报错,否则,将元素弹出,如果弹出的符号不是其对应的开放符号,则报错。到了文件尾,如果栈非空则报错。

//堆栈的定义和实现此处忽略

BracketChecker.h

/**从键盘读入字符串**/
void getString(char word[],int size);

/**获取字符数组的实际长度**/
int size(char word[],int length);

/**检查字符串是否通配**/
void checkChar(char word[],int size);


BracketChecker.c

#include "Stack.h"
#define true 1
#define false 0
/************************************************************************/
/*  
(1)如果不匹配则程序报错。
(2)栈中没有匹配的左括号或右括号。表现为在字符串中读到了一个右括号,而堆栈已空。
(3)或者栈中存在没有被匹配的分隔符程序也报错,其表现为把所有的字符串都读完了,栈中还留有分隔符。                                                                    */
/************************************************************************/

void getString(char word[],int size)
{
	fgets(word,size,stdin);
}

void checkChar(char word[],int size)
{	
	 int i;
	 int bError=false;
	 int capacity = 10;
	 //创建堆栈
	 Stack s = createStack(capacity);
	 for (i=0; i<size;i++)
	 {
		 char c = word[i];
		 switch(c){
			case '(':
			case '[':
			case '{':
				push(s,c);
				break;
			case ')':
			case ']':
			case '}':
				if (!isEmpty(s))
				{
					char popc = pop(s);
					if ((c==')' && popc!='(') || (c==']' && popc!='[') ||(c=='}' && popc!='{'))
					{
						//情况(1)
						bError = true;
						printf("Error:%c,%2d\n",c,i);
					}
				} else 
				{
					//情况(2),
					bError = true;
					printf("Error:%c,%2d\n",c,i);
				}
				break;
		 }
	 }
	 //情况(3)
	if (!isEmpty(s))
	{
		printf("Error miss right\n");
	} else if (!bError)
	{
		printf("此字符串匹配成功\n");
	}
}

int size(char word[],int length)
{
	int i;
	for (i=0;i<length;i++)
	{
		if (word[i]=='\0')
		{
			break;
		}
	}
	return i;
}

int main(void){
	char word[80];
	int length;//实际字符串长度
	getString(word,80);
	length = size(word,80);
	checkChar(word,length);
	return -1;
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值