1. 程式人生 > >題目2:括號配對問題

題目2:括號配對問題

  • 描述
    現在,有一行括號序列,請你檢查這行括號是否配對。
  • 輸入
    第一行輸入一個數N,表示有N組測試資料。後面的N行輸入多組輸入資料,每組輸入資料都是一個字串S(S的長度小於10000,且S不是空串),測試資料組數少於5組。資料保證S中只含有”[“,”]”,”(“,”)”四種字元
  • 輸出
    每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出Yes,如果不配對則輸出No

  • 演算法思想:
    括號匹配是資料結構——棧的一個簡單運用。
    首先對輸入字串從左到右進行掃描,如果掃描到的是左括號“(”、”]“,則將其入棧;
    如果掃描到的是右括號“)”、“]”,則查詢棧頂元素是否是與之匹配的左括號。
    如果是,則將棧頂元素彈出,繼續掃描字串的下一個字元;
    如果不是或者棧為空,則表明沒有與之對應的左括號,終止掃描,跳出迴圈。
    最後,判斷棧是否為空且字串是否已經掃描到末尾’\0’,
    如果兩者都成立,則表明括號匹配成功;
    否則,表明括號匹配失敗。

  • 原始碼(棧的所有操作附加上,所以程式碼有點冗餘,其中棧是用C語言寫的,故在標頭檔案上加入了

#include <iostream>
#include <cstdlib>
#include <string>
#include <stdio.h>
using namespace std;

#define true 1
#define false 0

typedef struct Node{
    char data;
    struct Node *pNext;
}NODE,*PNODE;

typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, *PSTACK;

void
init(PSTACK pS); void push(PSTACK pS, int val); void traverse(PSTACK pS); int pop(PSTACK pS, int *val); void clear(PSTACK pS); int empty(PSTACK pS); //棧的初始化 void init(PSTACK pS) { pS->pTop = (PNODE)malloc(sizeof(NODE)); if (NULL == pS->pTop) { printf("動態記憶體分配失敗!"); exit
(-1); } else { pS->pBottom = pS->pTop; pS->pTop->pNext = NULL; } return; } //插入元素到棧頂 void push(PSTACK pS, char val) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = val; pNew->pNext = pS->pTop; pS->pTop = pNew; return; } //遍歷棧S void traverse(PSTACK pS) { PNODE p = pS->pTop; printf("棧內元素為:"); while (p != pS->pBottom) { printf("%c\t", p->data); p = p->pNext; } printf("\n"); return; } //判斷棧是否為空 int empty(PSTACK pS) { if (pS->pTop == pS->pBottom) { return true; } else return false; } //刪除棧頂元素並將其值賦給*val int pop(PSTACK pS, char *val) { if (empty(pS)) { return false; } else { PNODE r = pS->pTop; *val = r->data; pS->pTop = r->pNext; free(r); r = NULL; } return 0; } //獲取棧頂元素 int gettop(PSTACK pS) { if (empty(pS)) { return false; } else { PNODE r = pS->pTop; return (r->data); } } //清空棧S void clear(PSTACK pS) { if (empty(pS)) { return; } else { PNODE p = pS->pTop; PNODE q = NULL; while (p != pS->pBottom) { q = p->pNext; free(p); p = q; } pS->pTop = pS->pBottom; return; } } int main() { int N; string str; STACK s; char ch; cin >> N; init(&s); while (N--) { int i; clear(&s); cin >> str; for ( i = 0; str[i] != '\0'; i++) { if (str[i] == '[' || str[i] == '(') { push(&s,str[i]); } else if (str[i] == ']' && gettop(&s) == '[') { pop(&s,&ch); } else if (str[i] == ')' && gettop(&s) == '(') { pop(&s, &ch); } else { break; } } if (str[i] == '\0' && empty(&s)) { cout << "Yes" << endl; } else { cout << "No" << endl; } } return 0; }
  • 心得
    程式很簡單,除錯的時候挺二貨的,本地除錯成功,測試也成功,提交就出現Wrong answer。仔細檢視題目,發現原來是輸出大小寫沒注意。浪費了十幾分鍾!!!