C語言實現 數據結構-棧-括號匹配


題目描述

假設一個表達式有英文字母(小寫)、運算符(+,—,*,/)和左右小(圓)括號構成,以“@”作為表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。假設表達式長度小於255,左圓括號少於20個。

輸入

一行字符串

輸出

YES或者NO

 

樣例輸入

((1+b)-(a+3))*4@

樣例輸出

YES

樣例輸入

(25+x)*(a*(a+b+b)@

樣例輸出

NO

算法實現:1.利用棧來實現只需要考慮輸入的是不是左括號'(' ,右括號')'
     2.當是左括號時 就讓'('進棧 ,當遇到右括號是')'就出棧。p.s 這里棧我用的靜態棧比較簡單~
     3.考慮棧里'('多余了,則用top判斷,如果完全匹配那么棧里的top應該為初始值為等於-1,輸出YES,否則輸出NO
     4.考慮棧元素下溢的問題,比如先輸入了一個右括號')',那么我們直接判斷他為NO,P.s:一開始我想如果表達式無所謂輸入格式,先輸入')'那不是下溢了嘛,后面在輸入'(',感覺棧就不太管用了emmm,是我多慮了或者審題不清

#include <stdio.h>
#define maxsize 260
typedef struct stack
{
int top ;
char arr[maxsize];
}STACK ;
void init(STACK * ps);
bool push(STACK * ps ,char val);
void show_stack(STACK * ps);
// char pop(STACK * ps );
bool Match_Brackets(STACK * ps);
bool pop(STACK * ps );
int main()
{
int i,val;
STACK st ;
init(&st);
if(Match_Brackets(&st))
{
printf("YES\n");
}
else
{
printf("NO\n");
}

}

void init(STACK * ps)
{
ps->top = -1;
}
bool Match_Brackets(STACK * ps)
{
char ch,x ;
int flag = 0 ;
while(1)
{
scanf("%c",&ch);
if(ch == '@')
{
break ;
}
else if(ch=='(')
{
push(ps,ch);
// show_stack(ps);
}
else if(ch==')')
{
if(pop(ps))
{
// show_stack(ps) ;
}
else
{
return false ;
}
}

}
if(ps->top == -1)
{
return true ;
}
else return false ;
}
bool push(STACK * ps ,char val)
{
if(ps->top == maxsize-1)
{
// printf("棧已滿\n");
return false ;
}
ps->arr[++ps->top]=val;
return true ;
}
void show_stack(STACK * ps)
{
int i = ps->top;
while(i!= -1)
{
printf("%c ",ps->arr[i--]);
}
printf("\n");

}
bool pop(STACK * ps )
{
char ch ;
if(ps->top == -1)
{
// printf("棧為空\n");
return false ;
}
else
{
ps->arr[ps->top--] ;
return true ;
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM