数据结构PTA习题:习题3.8 符号配对 (20分)

习题3.8 符号配对 (20分)

请编写程序检查C语言源程序中下列符号是否配对://、(与)、[与]、{与}。
输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。

输入样例1:

void test()
{
int i, A[10];
for (i=0; i<10; i++) /*/
A[i] = i;
}
.

输出样例1:

NO
/*-?

输入样例2:

void test()
{
int i, A[10];
for (i=0; i<10; i++) /**/
A[i] = i;
}]
.

输出样例2:

NO
?-]

输入样例3:

void test()
{
int i
double A[10];
for (i=0; i<10; i++) /**/
A[i] = 0.1*i;
}
.

输出样例3:

YES

读到左符号(、[、{、/*均压栈;
读到右符号后,先判断堆栈是否为空,若堆栈为空,则输出“读到的右符号缺少左符号”;若堆栈不空,弹出栈顶符号,对比两个符号是否配对,若不成对则输出“弹出的栈顶符号缺少右符号”;
最后全部读完后,判断堆栈是否为空,若堆栈不为空,则输出“栈顶符号缺少右符号”。
/*的情况特殊,每次需单独进行判断。
由于一行中只有一个句点.和一个回车时程序结束,因此需要用gets函数一次性读入一行数据,判断程序是否结束,每行内各个字符循环。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct S
{
 char *data;
 int top;
 int maxsize;
};
typedef struct S * Stack;
void push(Stack S, char c);
char pop(Stack S);
int main()
{
 Stack St;
 St = (Stack)malloc(sizeof(struct S));
 St->data = (char *)malloc(100 * sizeof(char));
 St->top = -1;
 St->maxsize = 100;
 int no = 0;
 char c;
 char a[1000];
 while (1)
 {
  gets(a);
  if (strcmp(a, ".") == 0) { break; }
  int n = strlen(a);
  for (int i = 0; i < n; i++)
  {
   if (a[i] == '(')
   {
    push(St, a[i]);
   }
   else if (a[i] == '[')
   {
    push(St, a[i]);
   }
   else if (a[i] == '{')
   {
    push(St, a[i]);
   }
   else if (a[i] == '/'&&a[i + 1] == '*')
   {
    push(St, a[i]);
    push(St, a[i + 1]);
    i++;
   }
   else if (a[i] == ')')
   {
    if (St->top == -1)
    {
     printf("NO\n");
     printf("?-)");
     no = 1;
     break;
    }
    else
    {
     c = pop(St);
     if (c != '(')
     {
      if (c == '*')
      {
       printf("NO\n");
       printf("/*-?");
       no = 1;
       break;
      }
      else
      {
       printf("NO\n");
       printf("%c-?", c);
       no = 1;
       break;
      }
     }
    }
   }
   else if (a[i] == ']')
   {
    if (St->top == -1)
    {
     printf("NO\n");
     printf("?-]");
     no = 1;
     break;
    }
    else
    {
     c = pop(St);
     if (c != '[')
     {
      if (c == '*')
      {
       printf("NO\n");
       printf("/*-?");
       no = 1;
       break;
      }
      else
      {
       printf("NO\n");
       printf("%c-?", c);
       no = 1;
       break;
      }
     }
    }
   }
   else if (a[i] == '}')
   {
    if (St->top == -1)
    {
     printf("NO\n");
     printf("?-}");
     no = 1;
     break;
    }
    else
    {
     c = pop(St);
     if (c != '{')
     {
      if (c == '*')
      {
       printf("NO\n");
       printf("/*-?");
       no = 1;
       break;
      }
      else
      {
       printf("NO\n");
       printf("%c-?", c);
       no = 1;
       break;
      }
     }
    }
   }
   else if (a[i] == '*'&&a[i + 1] == '/')
   {
    if (St->top == -1)
    {
     printf("NO\n");
     printf("?-*/");
     no = 1;
     break;
    }
    else
    {
     c = pop(St);
     if (c != '*')
     {
      printf("NO\n");
      printf("%c-?", c);
      no = 1;
      break;
     }
     else
     {
      c = pop(St);
      i++;
     }
    }
   }
  }
 }
 if (no == 0) {
  if (St->top == -1) { printf("YES\n"); }
  else
  {
   c = pop(St);
   if (c == '*')
   {
    printf("NO\n");
    printf("/*-?");
    no = 1;
   }
   else
   {
    printf("NO\n");
    printf("%c-?", c);
    no = 1;
   }
  }
 }
 return 0;
}
void push(Stack S, char c)
{
 S->top++;
 S->data[S->top] = c;
}
char pop(Stack S)
{
 return S->data[S->top--];
}

发布了21 篇原创文章 · 获赞 2 · 访问量 1640

猜你喜欢

转载自blog.csdn.net/wulila/article/details/105143410