例:堆栈在计算机语言的编译过程中用来进行语法检查,试编写一个算法,用来检查一个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;
}