括号匹配(栈)

 算法思想:

//初始化一个空栈,扫描表达式,依次读入字符,知道表达式扫描完或出现错误匹配

1.如果是'{'或'(',则将其压栈

2.如果是')'则根据当前栈顶元素进行分情况考虑,若是'('则此次匹配成功 ,否则非法,直接匹配不成功

3. 如果是'}'同2上面的处理方法。

//*****************括号匹配*********************
#include <iostream>
#include <stdlib.h>
using namespace std;
#define MAXSIZE 100

typedef struct
{
 char *base;
 char *top;

 int stacksize;
}Stack;

//初始化占
void Initstack(Stack &S)
{
 S.base = new char[MAXSIZE];

 if(!S.base)
 {
  exit(1);
 }
 S.top = S.base;

 S.stacksize = MAXSIZE;
}

//入栈
void Push(Stack &S,char c)
{
 if(S.top - S.base == S.stacksize)
 {
  cout<<"满!"<<endl;
  exit(1);
 }
 *S.top++ = c;
}

//出栈
void Pop(Stack &S,char &c)
{
 if(S.base == S.top)
 {
  cout<<"空栈!"<<endl;
  exit(1);
 }
 c = *--S.top;
}

//取栈顶元素
void GetTop(Stack &S,char &c)
{
 if(S.base == S.top)
 {
  cout<<"空!";
  exit(1);
 }
 c = *(S.top-1);
}

//判断栈是否为空 空返回ture 不空返回false
bool StackEmpty(Stack &sta)
{
 if(sta.base == sta.top)
 {
  return true;
 }
 else
 {
  return false;
 }
}

//括号匹配
bool Matching_Brackets(Stack &sta)
{
 int flag = 1;
 char x;
 char ch;
 cin>>ch;
 while(ch != '#' && flag)
 {
  switch(ch)
  {
  case '{':
   {
    Push(sta,ch);
   }
   break;
  case '(':
   {
    Push(sta,ch);
   }
   break;
  case ')':
   {
    GetTop(sta,x);
    if(!StackEmpty(sta) && x == '(')
    {
     Pop(sta,x);
    }
    else
    {
     flag = 0;
    }
   }
   break;
  case '}':
   {
    GetTop(sta,x);
    if(!StackEmpty(sta) && x == '{')
    {
     Pop(sta,x);
    }
    else
    {
     flag = 0;
    }
   }
   break;
  }
  cin>>ch;
 }
 /*括号情况: {()} 成功
             {()) 不成功
             {{()} 不成功
    {()}} 不成功 这种情况就用到了 maching中case的 if中!StackEmpty函数的判断了

 */
 /*左括号全部进栈分两种情况:1,括号数量(count)为奇数 2,括号数量为偶数
   当执行到下面if语句是,若是flag为1则可能匹配,同时count为偶数是,若为基数
 可能此时栈中不空,则匹配也失败*/
 if(StackEmpty(sta) && flag)
  return true;
 else
  return false;
}
int main()
{
 cout<<"******以#结束输入******"<<endl;
 Stack sta;
 Initstack(sta);
 bool B = Matching_Brackets(sta);
 if(B == true)
 {
  cout<<"匹配成功!"<<endl;
 }
 else
 {
  cout<<"匹配不成功!"<<endl;
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值