栈的C++实现及用于括号匹配

顺序栈的C++ 代码实现:

const int STACK_INIT_SIZE=6;//存储空间初始分配量
const int STACK_INCREMENT=10;//存储空间分配增量
template<class T>
class SeqStack
{//顺序栈
 //friend ostream operator<<(ostream& out,const SeqStack& ss);//重载输出操作符
public:
 SeqStack();
 void ClearStack();//清空栈
 bool StackEmpty();//判断栈是否为空
 int StackLength();//栈的长度
 bool GetTop(T& elem);//返回栈顶元素
 void Push(T elem);//元素入栈
 bool pop(T& elem);//栈顶元素出栈
 ~SeqStack();
private:
 T *base;//栈底指针
 T* top;//栈顶指针
 int stacksize;//当前已分配的存储空间
};

template<class T>
SeqStack<T>::SeqStack()
{
 base=new T[STACK_INIT_SIZE];
    top=base;
    stacksize=STACK_INIT_SIZE;
}

template<class T>
SeqStack<T>::~SeqStack()
{
 delete[] base;
 base=0;
 top=0;
 stacksize=0;
}

template<class T>
void SeqStack<T>::ClearStack()
{
     top=base;
}

template<class T>
bool SeqStack<T>::StackEmpty()
{
 if(top==base) return true;
 else return false;
}

template<class T>
int SeqStack<T>::StackLength()
{
 return top-base;
}

template<class T>
bool SeqStack<T>::GetTop(T &elem)
{
 if(!StackEmpty())
 {
  elem=*(top-1);
  return true;
 }
 else
  return false;
}

template<class T>
void   SeqStack<T>::Push(T elem)
{
 if(top-base>=stacksize)
 {//栈满,追加存储空间
  SeqStack<T> seq;
  T elem;
  while(this->pop(elem))
  {
   seq.Push(elem);
  }
        base=new T[STACK_INIT_SIZE+STACK_INCREMENT];
        top=base;
  while(seq.pop(elem))
  {
   this->Push(elem);
  }
 }
       *(top++)=elem;
}

template<class T>
bool SeqStack<T>::pop(T& elem)
{
     if(StackEmpty())
  {
   return false;
  }
  else
  {
   elem=*(--top);
   return true;
  }
}

栈的应用之一:(括号匹配)

SeqStack<char> seq;
 string expression;
 char tmp,elem;
 bool exit=false;
 cout<<"输入表达式:";
 cin>>expression;
 cout<<endl<<"输入的表达式是:"<<expression<<endl;
    int i=0;
 while(i<expression.length())
 {
  if(!exit)
  {
                 tmp=expression[i];
             switch(tmp)
            {
                case '(':
                case '[':
                     seq.Push(tmp);
                      break;
                case ')':
                    if(seq.GetTop(elem))
                    {
                          if(elem=='(')
                                seq.pop(elem);
                          else
                         {
                               exit=true;
                         }
                    }
        else
         exit=true;
                   break;
                case ']':
                        if(seq.GetTop(elem))
                      {
                              if(elem=='[')
                                      seq.pop(elem);
                                 else
                               {
                                   
                                        exit=true;
                               }
                     }
         else
          exit=true;
                       break;
                }
    i++;
  }
  else
  {
    cout<<"不匹配"<<endl;
   break;
  }
 }
 if(!exit)
  cout<<"匹配成功!"<<endl;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值