起因:
周一是我女朋友的生日,無奈公司的接口需要我去調試,心裡也確實放不下公司的事情,結果周末兩天都在公司調試加班,今天周一我和女友都上班,唉,太感謝我女友了,一個男人的高度很大程度上取決於身邊的女人啊,祝我寶貝璐璐生日快樂。
題目要求:
在某個字符串(長度不超過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;
}