用栈实现括号匹对
zzqth 2012-03-22 04:56:17 //stack.h
#ifndef STACK_H
#define STACK_H
static int level = 0;//存储最后入栈的元素级别0-3对应符号如下面symbol
const char symbol[4] = {'(','[','{','<'};
int checkCharLevel(char _char);//检测字符_char的级别,并返回
bool push(char * _string,char _char,int &num);//进栈函数
bool check(char *_string);
#endif
//stack.cpp
#include <iostream>
#include "stack.h"
int checkCharLevel(char _char)//检测字符_char的级别,并返回
{
int mylevel;
for (int i = 0;i < 4;i++)
{
if (_char==symbol[i])
{
mylevel = i;
break;
}
}
return mylevel;
}
bool push(char * _string,char _char,int &num)//进栈函数
{
bool flag = true;
int mylevel;//存储字符_char的级别
_string = _string + num;//把指针移动到栈顶
mylevel = checkCharLevel(_char);
if (mylevel<=level||num==0)//判断括号级别是否合理
{
*_string = _char;
level = mylevel;
num++;
}
else
{
flag = false;
}
return flag;
}
bool pop(char * _string,char _char,int &num)//出栈函数
{
bool flag = false;
if (num==0)
{
return flag;
}
_string = _string+num-1;
if (_char==')'&&*_string=='('||_char==(char)(*_string+2))//判断当前字符如之前进栈的字符是否相配
{
*_string = '\0';
num--;
if (num==0)//表示当前栈为空
{
level = 0;
}
else
{
level = checkCharLevel(*(--_string));//重置字符级别
}
flag = true;
}
return flag;
}
bool check(char *_string)
{
bool flag = true;
int num=0;//存储栈内元素的个数
char *pushString;//存储栈
pushString = new char [std::strlen(_string)+1];
for (int i = 0;_string[i]!=0;i++)
{
switch(_string[i])
{
case '<':
case '(':
case '[':
case '{':
flag = push(pushString,_string[i],num);//成功入栈,返回true,否则false
break;
case '>':
case ')':
case ']':
case '}':
flag = pop(pushString,_string[i],num);//成功出栈,返回true,否则false
break;
default:
break;
}
if (flag==false)
return flag;
}
return flag;
}
//main.cpp
#include <iostream>
#include "stack.h"
using namespace std;
void main()
{
char *_string;
int num;
cout << "please enter the number of string:";
cin >> num;
_string = new char[num];
cout << "please enter string:";
cin >> _string;
if (check(_string))
{
cout << "True!"
<< endl;
}
else
{
cout << "False!"
<< endl;
}
delete _string;
}