试编写一个函数,判断表达式中的括号是否匹配?
方法一:利用栈
/************************************************************************
* 环境:VS2008
* 函数名:test_parenthesis matching
*
* 函数功能:括号匹配,包括(),[],{}
返回结果:成功TRUE,失败FALSE
参 数:待匹配字符串
*
* 创建人: zpp, 2014/3/20
*
* 版本号:1.0
*
思路:
(0)设置vector模拟栈,一个字符指针,依次扫描字符串;
(1)遇到左括号'(','[','{'时进栈;
(2)遇到右括号'(','[','{'时取出栈顶字符,该字符和当前字符匹配.如果匹配则将栈顶字符出栈,字符指针后移,继续比较;
如果不匹配则返回false.
(3)遇到非括号字符则字符指针后移,继续比较。
************************************************************************/
#include "stdafx.h"
#include<iostream>
#include <vector>
using namespace std;
bool isMatch(const char* pStr)
{
const char* p = NULL;
p = pStr;
vector<char> Stack;
while(*p)
{
if( *p=='(' || *p=='[' || *p=='{' )
{
Stack.push_back(*p);
}
else if( *p==')'|| *p== ']'|| *p=='}')
{
if(Stack.empty())
return false;
char c=Stack[ Stack.size() - 1 ];
if(
( c== '(' && *p == ')' )
||( c== '[' && *p == ']' )
||( c== '{' && *p == '}' )
)
Stack.pop_back();
else
return false;
}
++p;
}
return Stack.empty()==1;
}
int _tmain(int argc, _TCHAR* argv[])
{
const char *p = "{[777]}";
printf("%s\n", isMatch(p)? "True": "False");
}
方法二:首尾各一个指针,在向中间移动的过程中判断
方法三:递归
不好理解的递归实现:
#include<windows.h>
#include<stdio.h>
#define FAIL -1
#define SUCCESS 0
char *next_token(char *s)
{
while(*s!='\0'&&*s!='['&&*s!=']'&&*s!='('&&*s!=')'&&*s!='{'&&*s!='}')
s++;
return s;
}
char UnChange(char *s )
{
switch( *s )
{
case '(':
return ')';
case ')':
return '(';
case '[':
return ']';
case ']':
return '[';
case '{':
return '}';
case '}':
return '{';
default:
return *s;
}
}
char* IsRecurMatch(char *string)
{
static int iCount = 0;
char cCurChar;
char *cur_char = NULL;
char *pcNext = NULL;
cur_char = next_token(string);
switch(*cur_char)
{
case '(':
case '[':
case '{':
cCurChar = UnChange(cur_char);
pcNext = IsRecurMatch(cur_char+1);
if( pcNext == '\0' )
{
return pcNext;
}
if( cCurChar == *pcNext )
{
//printf("字符%c匹配成功!\n", cCurChar);
pcNext = next_token(pcNext+1);
return pcNext;
}
else
{
printf("错误:字符%c匹配失败: %c != %c\n", *pcNext, UnChange(&cCurChar), *pcNext);
exit(1);
}
case ')':
case ']':
case '}':
return cur_char;
default:
return cur_char;
}
}
int Is_Match(char *string)
{
static int iCount = 0;
char *cTemp = IsRecurMatch(string);
iCount ++;
switch(*cTemp)
{
case ')':
case '}':
case ']':
{
if( iCount == 0 )
{
printf("错误:算术表达式不能以 %c 开头\n", *cTemp);
exit(1);
}
else
{
printf("错误:算术表达式 %c 无法匹配\n", *cTemp);
exit(1);
}
}
case '(':
case '[':
case '{':
Is_Match(cTemp);
break;
case '\0':
return 0;
default:
printf("不知道的错误!");
exit(1);
}
}
void main()
{
int iRet = Is_Match("{1klk]}");
if( iRet == 0 )
{
printf("成功!\n");
}
else
{
printf("失败!\n");
}
}
---------------------------------------------------------------------------
此题原链接:http://blog.csdn.net/dlengong/article/details/7408019
题目:输入括号的数目,输出括号的各种合法匹配样式 如
输入 2
输出
( ())
()()
完整运行代码如下:/************************************************************************
* 环境:VS2008
* 函数名:parenthesis matching_styles
*
* 函数功能:括号匹配,包括(),[],{}
返回结果:匹配括号的种类
参 数:括号的个数
*
* 创建: 2014/3/20
*
* 版本号:1.0
*
思路:括号匹配有合法有的不合法 如 (()))( 这样就不是合法的匹配样式。
为了避免这种情况的出现,记录当前左括号的个数和右括号的个数,
使右括号的个数不大于左括号的个数。主要思想类似于0-1背包问题,当进行到某一步的时候 有两种方法:放'(' 和 放 ')'
*
************************************************************************/
#include "stdafx.h"
#include<iostream>
#include <vector>
using namespace std;
void parenthesis matching_styles(int left,int right,int sum,vector<char> bracket)
{
if (left==sum&&right==sum) //如果左边和右边都为要匹配的个数,则输出结果
{
vector<char>::iterator iter=bracket.begin();
for ( ;iter!=bracket.end();iter++)
{
cout<<*iter<<' ';
}
cout<<endl;
return ;
}
if (left<=sum)
{
bracket.push_back('('); //放入左括号,然后递归
maching(left+1,right,sum,bracket);
bracket.pop_back(); //递归后弹出左括号
}
if (left>right&&left<=sum)
{
bracket.push_back(')');
maching(left,right+1,sum,bracket);
bracket.pop_back();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<char> bracket; //记录当前的匹配样式
int num;
cin>>num; //输入括号的个数
parenthesis matching_styles(0,0,num,bracket);
return 0;
//Console.ReadKey();
//Console.ReadLine();
getch();
}
----------------------------------------------------------------------------------------------------
注:需要特别注意的是代码的书写规范,空格缩进,注释等等,好的程序员一定会写易读,规范的代码。
代码书写是一门艺术!!!!!!!!