スタックによるカッコマッチングの問題


スタック構造は後進先出の特徴がある.カッコマッチングの問題の説明:式に3つのカッコが含まれている場合:カッコ、四角カッコ、およびカッコは、互いにネストできます.
アルゴリズムの思想:検査アルゴリズムの中で1つのスタックを設置することができて、1つの括弧を読み込むたびに、左の括弧ならば、直接スタックに入って、一致する同類の右の括弧を待つ;読み込みが右かっこで、現在のスタックトップの左かっこと同じタイプの場合、両方が一致し、スタックトップの左かっこをポップアップします.そうしないと、合法的ではありません.また.入力シーケンスが読み終わっても、スタックに一致待ちの左かっこがある場合、または右かっこが読み込まれ、スタックに一致待ちの同じタイプの左かっこがない場合は、いずれも不正です.入力シーケンスとスタックが同時に空になった場合、すべてのカッコが完全に一致していることを示します.
プログラム:かっこマッチングアルゴリズム
#include
#include
#define FALSE 0
#define TRUE 1

using namespace std;
//    ,              
typedef struct node{
    char data;
    struct node *next;
}linkStackNode;

typedef linkStackNode *linkstack;


int push(linkStack top,char x);

int* pop(linkStack top);

void bracketMatch(char *str);

bool match(char l,char r);

int main(){
    char a[30];
    cin.get(a,30); //    getline。        ,      。
    bracketMatch(a);
}

int push(linkStack top,char x){ //   x    top 
    linkStackNode *temp;
    temp=(linkStackNode *)malloc(sizeof(linkStackNode));
    if(temp==NULL)   return(FALSE);//      
    temp->data=x;
    temp->next=top->next;
    top->next=temp;  //        
    return(TRUE);  //       

}
char* pop(linkStack top){//  top         ,           
    linkStackNode *temp;
    char *x;
    temp=top->next;
    if(temp==NULL)   return(FALSE);
    top->next=temp->next;
    *x=temp->data;
    free(temp);
    return(*x);
}
bool match(char l,char r){
    bool judgematch=FALSE;
    if((l='('&&r=')')||(l='['&&r=']')||(l='{'&&r='}'))
        judgematch=TRUE;
    return judgematch;
}

void bracketMatch(char *str){//str[]        ,                    
    linkStack s;
    int i;
    char ch;
    for(i=0;str[i]!='\0';i++){
        switch(str[i]){
            case '(':
            case '[':
            case '{':  //        
                push(&s,str[i]);
                break;
            case ')':
            case ']':
            case '}':    //     
                if(s->next==NULL){  //    
                    cout<next->data;
                    if(match(ch,str[i]))
                        pop(&s,&ch);    //         
                    else{
                        cout<next=NULL)
            cout<

ここではC++標準ライブラリ(STL)でスタックとキューを実現し,使いやすくし,いくつかの方法を提供することもできる.