栈的顺序存储(2)

例:堆栈在计算机语言的编译过程中用来进行语法检查,试编写一个算法,用来检查一个C+十语言程序中的花括号、方括号和圆括号是否配对,若能够全部配对则返回1,否则返回0。

问题分析:在这个算法中,需要扫描待检查程序中的每一个字符,当扫描到每个花、方、圆左括号时,令其进栈,当扫描到每个花、方、圆右括号时,则检查栈顶是否为相应的左括号,若是则做退栈处理,若不是则表明出现了语法错误,应返回0。当扫描到程序文件结尾后,若栈为空则表明没有发现括号配对错误,应返回1,否则表明栈中还有未配对的括号,应返回0。另外,对于一对单引号或双引号内的字符不进行括号配对检查。

.cpp文件

#include <iostream>
#include <fstream>

using namespace std;

typedef char ElemType;

const int StackMaxSize = 50;

struct Stack
{
	ElemType stack[StackMaxSize];
	int top;
};

#include "stack.h"

int BracketsCheck(char *fname);

int main()
{
	cout<<BracketsCheck("D:\data.dat")<<endl;
	return 0;
}

int BracketsCheck(char *fname)
{
	ifstream ifstr(fname,ios::in|ios::_Nocreate);
	if(!ifstr)
	{
		cerr<<"File"<<"\ '"<<fname<<"\ '"<<"not found!"<<endl;
		exit(1);
	}
	Stack S;
	InitStack(S);
	char ch;
	while(ifstr>>ch)
	{
		if(ch == 39)
		{
			while(ifstr>>ch)
			{
				if(ch == 39)
					break;
			}
			if(ifstr)
				return 0;
		}
		else if(ch == 34)
		{
			while(ifstr>>ch)
			{
				if(ch == 34)
					break;
			}
			if(ifstr)
				return 0;
		}
		switch(ch)
		{
			case '{':
			case '[':
			case '(':
				Push(S,ch);
				break;
			case '}':
				if(Peek(S) == '{')
					Pop(S);
				else
					return 0;
				break;
			case ']':
				if(Peek(S) == '[')
					Pop(S);
				else
					return 0;
				break;
			case ')':
				if(Peek(S) == ')')
					Pop(S);
				else
					return 0;
				break;
		}
	}
	if(StackEmpty(S))
		return 1;
	else
		return 0;
}








评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值