您的位置:首页 > 编程语言 > C语言/C++

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

2008-10-29 22:21 393 查看
顺序栈的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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: