陣列模擬棧解決括號匹配
這三道題其實是一個型別,難度依次遞增,所以博主直接講最後一道,前面兩道直接給程式碼。
表示式括號匹配(stack)
時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 133 通過數: 90
【題目描述】
假設一個表示式有英文字母(小寫)、運算子(+,—,*,/)和左右小(圓)括號構成,以“@”作為表示式的結束符。請編寫一個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表示式長度小於255,左圓括號少於20個。
【輸入】
一行資料,即表示式。
【輸出】
一行,即“YES” 或“NO”。
【輸入樣例】
2*(x+y)/(1-x)@
【輸出樣例】
YES
#include<cstdio>
using namespace std;
char x[1000];
int main()
{
int top=0;
while(true)
{
char p;
scanf("%c",&p);
if(p=='@')
{
break;
}
if(p=='(')
{
top++;
}
if(p==')')
{
top--;
}
}
if (top!=0)
{
printf("NO");
}
else
{
printf("YES");
}
return 0;
}
括弧匹配檢驗
時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 232 通過數: 70
【題目描述】
假設表示式中允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,如([ ]())或[([ ][ ])]等為正確的匹配,[( ])或([ ]( )或 ( ( ) ) )均為錯誤的匹配。
現在的問題是,要求檢驗一個給定表示式中的括弧是否正確匹配?
輸入一個只包含圓括號和方括號的字串,判斷字串中的括號是否匹配,匹配就輸出 “OK” ,不匹配就輸出“Wrong”。輸入一個字串:[([][])],輸出:OK。
【輸入】
輸入僅一行字元(字元個數小於255)。
【輸出】
匹配就輸出 “OK” ,不匹配就輸出“Wrong”。
【輸入樣例】
[(])
【輸出樣例】
Wrong
#include<cstdio>
#include<cstring>
using namespace std;
char left[300];
int main()
{
char ch[300];
int top=-1,p;
scanf("%s",ch);
int k=strlen(ch);
for(int i=0;i<k;i++)
{
if(ch[i]=='('||ch[i]=='[')
{
top++;
left[top]=ch[i];
}
if(ch[i]==')')
{
if(left[top]=='(')
{
top--;
}
else
{
printf("Wrong");
return 0;
}
}
if(ch[i]==']')
{
if(left[top]=='[')
{
top--;
}
else
{
printf("Wrong");
return 0;
}
}
}
if(top!=-1)
{
printf("Wrong");
return 0;
}
printf("OK");
return 0;
}
字串匹配問題(strs)
時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 164 通過數: 54
【題目描述】
字串中只含有括號 (),[],<>,{},判斷輸入的字串中括號是否匹配。如果括號有互相包含的形式,從內到外必須是<>,(),[],{},例如。輸入: [()] 輸出:YES,而輸入([]),([)]都應該輸出NO。
【輸入】
第一行為一個整數n,表示以下有多少個由括好組成的字串。接下來的n行,每行都是一個由括號組成的長度不超過255的字串。
【輸出】
在輸出檔案中有n行,每行都是YES或NO。
【輸入樣例】
5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
【輸出樣例】
YES
YES
YES
YES
NO
大體思路:直接讀入字串,將左括號存入棧裡,存入時比較與前一個括號的大小關係是否合法,合法則存入,top加一;如果遇到右括號則比較棧頂元素,匹配則首指標top減一。
這裡博主在讀入時將四種括號分為四級,方便比較,除以10可得到等級,對10取模得知左/右括號
#include<cstdio>
#include<cstring>
using namespace std;
int ch[300];
int str[300];
int top=0;
int in()
{
char x[300];
scanf("%s",x);
int k=strlen(x);
for(int i=0;i<k;i++)
{
if(x[i]=='{')
{
ch[i+1]=41;
continue;
}
if(x[i]=='}')
{
ch[i+1]=42;
continue;
}
if(x[i]=='[')
{
ch[i+1]=31;
continue;
}
if(x[i]==']')
{
ch[i+1]=32;
continue;
}
if(x[i]=='(')
{
ch[i+1]=21;
continue;
}
if(x[i]==')')
{
ch[i+1]=22;
continue;
}
if(x[i]=='<')
{
ch[i+1]=11;
continue;
}
if(x[i]=='>')
{
ch[i+1]=12;
continue;
}
}
return k;
}
bool check(int k)
{
for(int i=1;i<=k;i++)
{
if(ch[i]%10==1)
{
if(str[top]>=ch[i])
{
top++;
str[top]=ch[i];
}
else
{
return false;
}
}
if(ch[i]%10==2)
{
if(str[top]/10==ch[i]/10)
{
top--;
}
else
{
return false;
}
}
}
if(top!=0)
{
return false;
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
str[0]=100;
int k=in();
if(check(k))
{
printf("YES\n");
continue;
}
printf("NO\n");
top=0;
memset(ch,0,sizeof(ch));
memset(str,0,sizeof(str));
}
return 0;
}