#include <assert.h>
using namespace std;
struct LinkNode{
char data;
struct LinkNode *link;
LinkNode(){int data=0;LinkNode *top=NULL;}
};
class LinkedStack{
private:
LinkNode *top;
int size;
public:
LinkedStack(){top = NULL ;};
~LinkedStack(){makeEmpty();};
void push(char x);
char pop();
bool makeEmpty();
int getSize();
bool getTop();
bool isEmpty();
};
void LinkedStack::push(char x){
LinkNode *newNode=new LinkNode;
newNode->data=x;
newNode->link=top;
top=newNode;
size++;
assert(top!=NULL); };
bool isEmpty(){
if(top == NULL)return true; //這裏老是提示top為“未定義標識符”怎麽辦?
return false;
//return (top==NULL)?true:false;這種寫法也提示出錯
};
char LinkedStack::pop() {
char x;
if(isEmpty()==true){
cout<<"空鏈表,沒有出棧的元素了哦,傻瓜!"<<endl;
return false;}
LinkNode *p=top;
top= top->link;
x=p->data;
delete p;
return x;
};
bool LinkedStack::makeEmpty(){ //使鏈表全部清空
LinkNode *p;
cout<<"進行元素清空處理"<<endl;
while(top!= NULL){p=top;top=top->link;delete p;}
cout<<"小鬼,鏈式棧的元素已經清空完畢 !"<<endl;
return true;
};
int LinkedStack::getSize(){ //獲得表的長度
LinkNode *p=top;
int k =0;
while(top!=NULL){
top=top->link; k++;
}
cout<<"現在鏈表的長度為 :"<<k<<endl;
return k;
};
void main (){
LinkedStack lstack;
int n ;
cout<<"請輸入妳要輸入的字符總長度(小於100) :"<<endl;
cin>>n;
//char *p = new expression[100];
char expression[100];
cout<<"請輸入妳要測試的符號內容 :"<<endl;
for(int i=0;i<n;i++){
cin>>expression[i];
}
for(int j=0;j<n ;j++){
if(expression[j] ==( '('||'{'||'[')){
lstack.push(expression[j]);
}
if(expression[j] == (')'||'}'||']')){
if( expression[j] == lstack.pop()){
cout<<"第"<<j+1<<"處的字符有匹配的括號"<<endl;
}else{
cout<<"第"<<j+1<<"處的字符沒有匹配的括號"<<endl;
}
}
}
while(lstack.isEmpty() == false){
int d = lstack.getSize();
cout<<"不能匹配的括號個數為 :"<<d<<endl;
cout<<"它們分別為: "<<endl;
for(int k=0;k<=d;k++){
lstack.pop();
}
}
lstack.makeEmpty();
system("Pause");
}