题目描述
修改10.2节的栈示例使它存储字符而不是整数。接下来,增加main函数,用来要求用户输入10个圆括号或花括号,然后指出它们之间的嵌套是否正确,若匹配输出1,否则输出0:
((){}{()})
1
输入
输入10个圆括号或花括号。
输出
输出识别的圆括号或花括号嵌套结果,若正确嵌套,输出1,否则输出0。
样例输入
((){}{()})
样例输出
1
提示
1、读入左圆括号或左花括号时,把他们像字符一样压入栈中。当读入右圆括号或右花括号时,把栈顶的项弹出,并且检查出项是否是匹配的圆括号或花括号;(如果不是,那么圆括号或花括号嵌套不正确。)
2、如果程序未读取完10个圆括号或花括号,当读入右圆括号或右花括号时,但发现栈为空,那么圆括号或花括号不匹配;
3、当程序读取完10个圆括号或花括号时,检查栈是否为空。如果为空,那么圆括号或花括号匹配;如果栈不为空,那么圆括号或花括号不匹配。
#include <stdio.h>
#include <stdbool.h>
#define STACK_SIZE 10
char contents[STACK_SIZE];
int top = 0;
bool is_empty(void)
{
return top == 0;
}
void push(char i)
{
contents[top++] = i;
}
char pop(void)
{
return contents[--top];
}
int main(void)
{
int i;
char ch1, ch2;
for(i = 0; i < STACK_SIZE; i ++) {
ch1 = getchar();
if(ch1 == '{' || ch1 == '(') {
push(ch1);
} else {
if(is_empty()){
printf("0");
return 0;
} else {
ch2 = pop();
if((ch1 == '}' && ch2 != '{') ||
(ch1 == ')' && ch2 != '(')) {
printf("0");
return 0;
}
}
}
}
if(is_empty()){
printf("1");
} else {
printf("0");
}
return 0;
}