使用字符串堆栈进行推送和弹出操作

时间:2015-05-27 19:09:16

标签: c pointers push

请回答 如果(i)它具有相同数量的'('和')'字母,并且(ii)对于x中的每个')',字符串x是完全匹配的,那么在x之前有一个唯一的'('例如,字符串“a()”,“(a)”和“(a(a))”匹配良好,而“a(”,“)a(”和“())(”不是如果给定的字符串x匹配良好,则以下函数应返回1,否则应返回0:

int matched(char *x) {
  int i;
  stack_t s;
  init(&s);
  for(i = 0; x[i] != '\0'; i++) {
    switch(x[i]) {
    case '(':
      push(&s, x[i]); break;
    case ')':
      if(isEmpty(&s)) return 0;
      if(pop(&s) == '(') return 1;
      else return 0;
    }
  }
  return isEmpty(&s);
}

假设push()操作永远不会失败,上面的函数:

注意:如果堆栈为空,则isEmpty()函数正确返回1,否则返回0。  A.在所有字符串上正常工作  B.在输入“a()”上返回错误的答案  C.在输入上返回错误答案“)a”  D.在输入“())”

上返回错误的答案

1 个答案:

答案 0 :(得分:1)

你已经掌握了基本的想法:穿过绳子,推开开口,弹出关闭的parens。您有两个不匹配括号的基本情况:(1)您关闭了一个未打开的括号。在这种情况下,您下载堆栈。 (2)你不要关闭打开的括号。在这里,你走完琴弦后,你仍然在堆叠上打开了parens。

你的错误是当你弹出堆栈时:文件堆栈是空的,你会下溢它,所以你(正确)返回false。成功弹出括号后,请不要返回。您必须检查字符串的其余部分是否正确。 return离开函数并打破循环。它不会为以后设置返回值,它会立即返回。

所以:

int matched(const char *x)
{
    int i, j;
    stack_t s;

    init(&s);

    for (i = 0; x[i] != '\0'; i++) {
        switch (x[i]) {
        case '(':
            push(&s, i);
            printf("Opening paren at %d\n", i);
            break;

        case ')':
            if (isEmpty(&s)) return 0;
            j = pop(&s);
            printf("Closing paren opened at %d at %d\n", j, i);
            break;
        }
    }

    return isEmpty(&s);
}

我已经冒昧地推动了这些蠢事。位置,以便堆栈上至少有一些有意义的数据。 printf语句仅供参考。

(这些小问题通常可以通过铅笔和纸张或在开发过程中打印信息来播放。)