題目2:括號配對問題
阿新 • • 發佈:2019-01-28
- 描述
現在,有一行括號序列,請你檢查這行括號是否配對。 - 輸入
第一行輸入一個數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。仔細檢視題目,發現原來是輸出大小寫沒注意。浪費了十幾分鍾!!!