栈(洛谷P1739 表达式括号匹配)
题目
见题目链接
题目链接表达式括号匹配 - 洛谷
输入
见题目链接
输出
见题目链接
样例
见题目链接
题解
用一个栈来存储做括号,读取输入的时候,每读到一个左括号则压入栈,碰到右括号先判断栈是否为空,若为空,则输出“NO”(表明这个右括号无法被匹配),若不为空,则从栈中弹出一个左括号。读取输入结束后,判断栈是否为空,若为空,表明左括号和右括号恰好能匹配,输出“YES”,若不为空,说明有多的左括号无法匹配,输出“NO”。
代码
#include <stdio.h>
#define MAXSIZE 20
typedef struct{
char Data[MAXSIZE];
int topIdx;
}SeqStack;
void Push(SeqStack *L, char c){
L->topIdx++;
L->Data[L->topIdx] = c;
}
int Pop(SeqStack *L){
L->topIdx—;
return L->Data[L->topIdx];
}
int isEmpty(SeqStack L){
if (L.topIdx != 0){
return 1;
}
else{
return 0;
}
}
int main(){
char c;
SeqStack bracket;
bracket.topIdx = 0;
do {
scanf("%c", &c);
if (c == '(')
Push(&bracket, c);
if (c == ')'){
if (isEmpty(bracket) == 0){
printf("NO");
return 0;
}
else
{
Pop(&bracket);
}
}
}while(c != '@');
if (isEmpty(bracket) == 0)
printf("YES");
else
printf("NO");
return 0;
}
代码详解
栈定义:
typedef struct{
char Data[MAXSIZE];
int topIdx;
}SeqStack;
压入元素:
void Push(SeqStack *L, char c){
L->topIdx++;
L->Data[L->topIdx] = c;
}
弹出栈顶元素:
int Pop(SeqStack *L){
L->topIdx—;
return L->Data[L->topIdx];
}
判断栈是否为空:
int isEmpty(SeqStack L){
if (L.topIdx != 0){
return 1;
}
else{
return 0;
}
}
括号匹配算法逻辑部分:
do {
scanf("%c", &c);
if (c == '(')
Push(&bracket, c); //如果读入左括号,则压入栈
if (c == ')'){ //如果读入右括号
if (isEmpty(bracket) == 0){
printf("NO"); //如果栈为空,判断为无法匹配
return 0;
}
else
{
Pop(&bracket); //如果栈不为空,则从栈中弹出一个左括号
}
}
}while(c != '@');
if (isEmpty(bracket) == 0)
printf("YES"); //最后若栈为空,则左括号和右括号恰好匹配
else
printf("NO"); //最后若栈不为空,则左括号还有剩余未匹配