判断表达式中的括号是否匹配

1.设有算术表达式,其中包含有大括号“{ "" }"  中括号"[" "]" 小括号 "(" ")"

试编写一个函数,判断表达式中的括号是否匹配?

方法一:利用栈

/************************************************************************
*   环境: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();
}

----------------------------------------------------------------------------------------------------

注:需要特别注意的是代码的书写规范,空格缩进,注释等等,好的程序员一定会写易读,规范的代码。

 代码书写是一门艺术!!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值