程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 括號匹配檢測——棧的應用

括號匹配檢測——棧的應用

編輯:C++入門知識

起因:
周一是我女朋友的生日,無奈公司的接口需要我去調試,心裡也確實放不下公司的事情,結果周末兩天都在公司調試加班,今天周一我和女友都上班,唉,太感謝我女友了,一個男人的高度很大程度上取決於身邊的女人啊,祝我寶貝璐璐生日快樂。
題目要求:
在某個字符串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何一個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫一個程序,找到無法匹配的左括號和右括號,輸出原來字符串,並在下一行標出不能匹配的括號。不能匹配的左括號用"$"標注,不能匹配的右括號用"?"標注.
輸入:
    輸入包括多組數據,每組數據一行,包含一個字符串,只包含左右括號和大小寫字母,字符串長度不超過100。
    注意:cin.getline(str,100)最多只能輸入99個字符!
輸出:
    對每組輸出數據,輸出兩行,第一行包含原始輸入字符,第二行由"$","?"和空格組成,"$"和"?"表示與之對應的左括號和右括號不能匹配。
樣例輸入:
)(rttyy())sss)(
樣例輸出:
)(rttyy())sss)(
?            ?$
算法思想:
括號匹配是典型的棧的應用,因此我采用鏈棧,思路如下:

(1)第一次遍歷輸入字符串,
        1.是左括號,則入棧,同時標記數組的相應位置置空格
        2.是右括號,則檢測棧是否為空,不為空,則判斷有對應的左括號,同時出棧;為空,則沒有對應的左括號,標記數組置‘?’
(2)第二次遍歷輸入字符串,
        1.是右括號,則入棧
        2.是左括號,則檢測棧是否為空,不為空,則判斷有對應的右括號,同時出棧;為空,則沒有對應的左括號,標記數組置‘$’
代碼實現如下:
[cpp] 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
//采用鏈棧的數據結構 
struct stacknode 

    char bracket; 
    struct stacknode *next; 
}; 
typedef struct 

    struct stacknode *top; 
}linkstack; 
 
/**
 * Description:初始化鏈棧
 */ 
void initstack(linkstack *s) 

    s -> top = NULL; 

 
/**
 * Description;判斷棧是否為空
 */ 
int stackempty(linkstack *s) 

    int flag; 
 
    flag = (s -> top == NULL)? 1 : 0; 
 
    return flag; 

 
/**
 * Description:入棧操作
 */ 
void push(linkstack *s, char str) 

    struct stacknode *p; 
    p = malloc(sizeof(struct stacknode)); 
    p -> bracket = str; 
    p -> next = s -> top; 
    s -> top = p; 

 
/**
 * Description:出棧操作
 */ 
char pop(linkstack *s) 

    char str; 
    struct stacknode *p = s -> top; 
    str = p -> bracket; 
    s -> top = p -> next; 
    free(p); 
    return str; 

 
int main() 

    char input[101]; 
    char flag[101]; 
    char ch; 
    int i, len, j, k; 
    linkstack *s; 
    s = malloc(sizeof(linkstack)); 
 
    while(scanf("%s",input) != EOF) 
    { 
        len = strlen(input); 
        initstack(s); 
        for(i = 0; i < len; i ++) 
        { 
            switch(input[i]) 
            { 
                case '(': 
                    //左括號入棧 
                    push(s,input[i]); 
                    flag[i] = ' '; 
                    break; 
                case ')': 
                    //判斷棧空 
                    if(stackempty(s)) 
                    { 
                        flag[i] = '?'; 
                    }else 
                    { 
                        flag[i] = ' '; 
                        ch = pop(s); 
                    } 
                    break; 
                default: 
                    flag[i] = ' '; 
                    break; 
            } 
        } 
        initstack(s); 
        for(i = len - 1; i >= 0; i --) 
        { 
            switch(input[i]) 
            { 
                case ')': 
                    //右括號入棧 
                    push(s,input[i]); 
                    break; 
                case '(': 
                    //判斷棧空 
                    if(stackempty(s)) 
                    { 
                        flag[i] = '$'; 
                    }else 
                    { 
                        flag[i] = ' '; 
                        ch = pop(s); 
                    } 
                    break; 
                default: 
                    break; 
            } 
        } 
 
        //打印輸出 
        printf("%s\n%s\n",input,flag); 
        memset(input,'\0',sizeof(input)); 
        memset(flag,'\0',sizeof(flag)); 
    } 
 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved