栈应用之括号匹配



#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 2//定义栈空间的初始空间值
template<class element>
class Stract//该栈主要采用顺序表的存储方式
{
public:
 Stract()
  :_finish(0)
  , _capacity(MAXSIZE)
  , _array((element*)malloc(MAXSIZE*sizeof(element)))
 {}
 void Reverse(element data)//当栈空间不足的时候会自动进行增容操作
 {
  element* p = (element*)malloc((5 + MAXSIZE)*sizeof(element));
  if (p)//开辟空间成功
  {
   //1、现将原空间的内容拷贝到新空间里
   //2、释放旧空间
   //3、将旧空间赋值给_array
   //3、赋值,更改_finish,_capacity的值
   strcpy(p, _array);
   free(_array);
   _array = p;
   _array[_finish] = data;
   _capacity = _capacity + 5;
   _finish = _finish + 1;
  }
  else
  {
   printf("Reverse::开辟空间失败!\n");
  }
 }

 void Push(element data)//进行入栈操作
 {
  //如果栈空间满了,则自动进行扩容操作
  if (_finish == _capacity) Reverse(data);
  else{
   _array[_finish] = data;
   _finish = _finish + 1;
  }
 }
 element Pop()//出栈
 {
  //1、先判断栈是否为空
  //2、如果栈为空就直接返回
  //3、如果栈不为空则弹出最后一个元素
  if (_finish)
  {
   _finish--;
   return _array[_finish];
  }
  return 0;
 }
 void Display()//打印栈空间的内容
 {
  int i = 0;
  while (i < _finish)
  {
   char p = _array[i];
   printf("%c", p);
   i++;
  }
 }
 bool Empty()//判断栈是否为空,为空的话返回1,否则返回0
 {
  return !_finish;//注意一定要加非号!
 }
private:
 element* _array;//栈空间
 int _finish;//现在已经有的数量
 int _capacity;//容量
};


bool LeftParenthesis(char arr)//判断是否为左括号
{
 return (arr == '{' || arr == '[' || arr == '(');
}
bool RightParenthesis(char arr)//判断是否为右括号
{
 return (arr == '}' || arr == ']' || arr == ')');
}
bool Matching(char p1,char p2)//判断括号是否匹配
{
 if (p1 == '{'){
  if (p2 == '}') return 1;
  return 0;
 }
 else if (p1 == '['){
  if (p2 == ']') return 1;
  return 0;
 }
 else{
  if (p2 == ')') return 1;
  return 0;
 }
}
bool Test(Stract<char> s, char* arr)//测试函数
{
 if (arr == NULL)  return 1;
 while (arr)
 {
  //1、如果接收到的字符是左括号则入栈进行下一个字符的获取
  //2、如果接收到的字符是右括号则进行取栈顶操作,出栈的字符与接收到的字符进行匹配,
  //  如果是相同的则出栈,如果不同则返回0
  //3、如果不是括号,不做任何处理,自动取下一个字符。
  //4、当取完字符后判断栈是否为空,若为空则匹配成功,若不为空则说明还有左括号存在,则说明左括号多余。
  if (LeftParenthesis(*arr))  s.Push(*arr);
  else if (RightParenthesis(*arr)){
   if (s.Empty()){
    printf("右括号多余!");
    return 0;
   }
   else {
    char temp = s.Top();
    if (Matching(temp, *arr)) s.Pop();
    else return 0;
   }
  }
  else;
  arr++;
 }
 if (s.Empty()){ 
  printf("左括号多余!\n");
  return 0; 
 }
 return 1;
}
int main()
{
 Stract<char> s;
 char arr[] = "(ab)((d)";
 char* p = arr;
 printf("%d",Test(s, arr));
 return 0;
}




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值