浙大数据结构第二版——习题3.8 符号配对
·


思路:
1.括号匹配问题首先想到使用栈数据结构
2.遇到左括号一直压栈保存即可
3.遇到右括号,出栈一个符号ch_t,若ch_t是该右括号对应的左括号则继续;若不是,则将ch_t压回栈中,结束循环。
注1:可能遇到栈为空的情况,即:符号ch_t='\0'。此时不必压栈处理。
4.若最后栈空,说明所有括号成功匹配,输出yes。
5.若栈非空,则输出no,并按照题目要求的格式,输出栈顶元素。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
//栈数据结构
typedef struct StackNode{
char c[1000];
int top;
} *Stack;
//判空
bool isEmpty(Stack stack){
if(stack->top==-1){
return true;
}else{
return false;
}
}
//初始化
Stack InitStack(){
Stack stack;
stack=(Stack)malloc(sizeof(struct StackNode));
stack->top=-1;
strcpy(stack->c,"");
return stack;
}
//压栈
void Push(Stack stack,char ch){
stack->top++;
stack->c[stack->top]=ch;
}
//出栈
char Pop(Stack stack){
if(isEmpty(stack)){
return '\0';
}
char ch=stack->c[stack->top];
stack->c[stack->top]='\0';
stack->top--;
return ch;
}
int main(){
Stack stack=InitStack();
char ch,a[1000]={0};
int i=0;
while((ch=getchar())!=EOF){
a[i]=ch;
i++;
}
char t;
for(i=0;;i++){
if(a[i-2]=='\n'&&a[i-1]=='.'&&a[i]=='\n'){//终止条件
break;
}
if(a[i]=='('){//左括号
Push(stack,a[i]);
}else if(a[i]==')'){
t=Pop(stack);
if(t!='('){//右括号
if(t!='\0'){
Push(stack,t);
}else{
Push(stack,a[i]);
}
break;
}
}else if(a[i]=='/'&&a[i+1]=='*'){
i++;
Push(stack,'<');
}else if(a[i]=='*'&&a[i+1]=='/'){
i++;
t=Pop(stack);
if(t!='<'){
if(t!='\0'){
Push(stack,t);
}else{
Push(stack,'>');
}
break;
}
}else if(a[i]=='['){
Push(stack,'[');
}else if(a[i]==']'){
t=Pop(stack);
if(t!='['){
if(t!='\0'){
Push(stack,t);
}else{
Push(stack,a[i]);
}
break;
}
}else if(a[i]=='{'){
Push(stack,a[i]);
}else if(a[i]=='}'){
t=Pop(stack);
if(t!='{'){
if(t!='\0'){
Push(stack,t);
}else{
Push(stack,a[i]);
}
break;
}
}
}
if(isEmpty(stack)){//正确匹配
printf("YES");
}else{//错误匹配
printf("NO\n");
t=Pop(stack);
if(t=='<'){
printf("/*-?");
}else if(t=='>'){
printf("?-*/");
}else if(t=='('){
printf("(-?");
}else if(t==')'){
printf("?-)");
}else if(t=='['){
printf("[-?");
}else if(t==']'){
printf("?-]");
}else if(t=='{'){
printf("{-?");
}else if(t=='}'){
printf("?-}");
}
}
}
最终好结局:

更多推荐
所有评论(0)