編寫一個算法,檢查一個程序中的花括號,方括號和圓括號是否配對,若能夠全部配對則返回1,否則返回0。
Head.h:
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#include<iostream>
struct LinkedNode
{
int data;
LinkedNode*next;
};
class LinkedStack//鏈式棧的類定義
{
public:
LinkedStack();
~LinkedStack(){makeEmpty();};
void Push(LinkedNode &);
int Pop();
bool getTop(LinkedNode&x)const;
bool IsEmpty()const{return (top==NULL)?true:false;}
int getSize()const;
void makeEmpty();
void print();
private:
LinkedNode *top;
};
#endif // HEAD_H_INCLUDED
Methods.cpp:
#include"head.h"
#include<iostream>
using namespace std;
LinkedStack::LinkedStack(){top=NULL;}
void LinkedStack::makeEmpty()
{
LinkedNode*p;
while(top!=NULL)
{
p=top;top=top->next;delete p;
}
}
void LinkedStack::Push(LinkedNode &x)
{
LinkedNode *p=top;
x.next=p;
top=&x;
}
int LinkedStack::Pop()
{int data=top->data;
LinkedNode*p=top;
top=top->next;
delete p;
return data;
}
bool LinkedStack::getTop(LinkedNode&x)const
{
if(IsEmpty()==true)return false;
x=*top;
return true;
}
int LinkedStack::getSize()const
{
int k=0;
LinkedNode*p=top;
while(p!=NULL){p=p->next;k++;}
return k;
}
void LinkedStack::print()
{
cout<<"棧中元素個數="<<getSize()<<endl;
LinkedNode*p=top;int i=0;
while(p!=NULL)
{
cout<<++i<<":"<<p->data<<endl;
p=p->next;
}
}
Main.cpp:
#include"head.h"
#include <iostream>
#include<string.h>
using namespace std;
//所要求的判斷括號匹配的算法
void PrintMatchedPairs(char *expression)
{
LinkedStack s1;LinkedStack s2;LinkedStack s3;
int j,length=strlen(expression);
cout<<"對於小括號()的情況:"<<endl;
for(int i=1;i<=length;i++)
{
if(expression[i-1]=='('){LinkedNode t;t.data=i;s1.Push(t);}//左括號,位置進棧
else if(expression[i-1]==')')
{
if(s1.IsEmpty()==false){j=s1.Pop();cout<<j<<"與"<<i<<"匹配"<<endl;}
else cout<<"沒有與第"<<i<<"個右括號匹配的左括號!"<<endl;
}
}
while(s1.IsEmpty()==false)
{
j=s1.Pop();
cout<<"沒有與第"<<j<<"個括號相匹配的右括號!"<<endl;
}
cout<<"對於中括號[]的情況:"<<endl;
for(int i=1;i<=length;i++)
{
if(expression[i-1]=='['){LinkedNode t;t.data=i;s2.Push(t);}//左括號,位置進棧
else if(expression[i-1]==']')
{
if(s2.IsEmpty()==false){j=s2.Pop();cout<<j<<"與"<<i<<"匹配"<<endl;}
else cout<<"沒有與第"<<i<<"個右括號匹配的左括號!"<<endl;
}
}
while(s2.IsEmpty()==false)
{
j=s2.Pop();
cout<<"沒有與第"<<j<<"個括號相匹配的右括號!"<<endl;
}
cout<<"對於大括號{}的情況:"<<endl;
for(int i=1;i<=length;i++)
{
if(expression[i-1]=='{'){LinkedNode t;t.data=i;s3.Push(t);}//左括號,位置進棧
else if(expression[i-1]=='}')
{
if(s3.IsEmpty()==false){j=s3.Pop();cout<<j<<"與"<<i<<"匹配"<<endl;}
else cout<<"沒有與第"<<i<<"個右括號匹配的左括號!"<<endl;
}
}
while(s3.IsEmpty()==false)
{
j=s3.Pop();
cout<<"沒有與第"<<j<<"個括號相匹配的右括號!"<<endl;
}
}
int main()
{
char s[100];
cout<<"請輸入要判斷的帶有三種括號的字符串"<<endl;
cin>>s;
PrintMatchedPairs(s);
return 0;
}
運行結果: