#include <iostream> using namespace std; template<class T> struct Node { T data; Node<T> *next; }; template<class T> class LinkStack { public: LinkStack() { top=NULL; bottom=NULL; } virtual ~LinkStack(); void Push(T x); void Pop(); bool Empty(); T GetTop(); int GetSize(); private: Node<T> *top; Node<T> *bottom; }; template<class T> LinkStack<T>::~LinkStack() { Node<T> *p=NULL; while (bottom) { p=bottom; //cout<<p->data<<endl; //用于测试 bottom = bottom->next; delete p; } } template<class T> void LinkStack<T>::Push(T x) { Node<T> *s=new Node<T>; s->data = x; s->next = NULL; if (bottom==NULL) { top=s; bottom=s; } else { top->next=s; top=s; } } template<class T> void LinkStack<T>::Pop() { Node<T> *p=NULL; if (bottom==NULL) //栈为空 { cerr<<"Stack is empty"<<endl; return; } p=bottom; if (bottom==top) //栈只有一个元素 { bottom=NULL; top=NULL; return; } while (p->next!=top) //找到栈顶的前一个元素 { p=p->next; } Node<T> *q=top; delete q; top=p; top->next=NULL; } template<class T> bool LinkStack<T>::Empty() { if (bottom == NULL) { return true; } else { return false; } } template<class T> T LinkStack<T>::GetTop() { Node<T> *p=top; if(top==NULL) { cout<<"Stack has no element"<<endl; return -1; } else return p->data; } template<class T> int LinkStack<T>::GetSize() { Node<T> *pTemp=bottom; if (bottom==NULL) { return 0; } int len=1; while (pTemp!=top) { pTemp=pTemp->next; len++; } return len; } void Bracket(char *a,int len) //实现括弧匹配 { LinkStack<char> temp; for(int i=0;i<len;i++) { if(a[i]=='(' || a[i]=='[') temp.Push(a[i]); else { if ((temp.GetTop()=='('&&a[i]==')') || (temp.GetTop()=='['&&a[i]==']')) temp.Pop(); else { cout<<"匹配失败"<<endl; return; } } } if(temp.GetSize()==0) cout<<"匹配成功"<<endl; else cout<<"匹配失败"<<endl; } int main() { LinkStack<char> test; char ch[20]="abcdefg"; for (int i=0;i<strlen(ch);++i) { test.Push(ch[i]); } cout<<test.GetSize()<<endl; char bra[20]="(())([]])"; Bracket(bra,strlen(bra)); return 0; }