Chinaunix首页 | 论坛 | 博客
  • 博客访问: 298926
  • 博文数量: 76
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 715
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-20 20:38
文章分类
文章存档

2016年(20)

2015年(56)

分类: 嵌入式

2016-02-29 22:35:55


  1. 栈的应用之括号匹配的检验
  2. 16年2月29日22:09:16
  3. 检验括号匹配的方法,就是对给定的字符串依次检验,若是左括号,入栈,若是右括号,则判断栈最上面那个元素,如果能够匹配,就继续判断,如果不匹配的话就返回错误。如果是其他字符,就不检验。检验到字符串的结尾的话,这时候要判断栈是否为空,判断是否有剩余的左括号。

  4. #include <stdio.h>
  5. #include <malloc.h>
  6. #include <stdlib.h>

  7. #define STACK_INIT_SIZE 100
  8. #define STACK_INCREMENT 10


  9. typedef struct {
  10.     char *top;
  11.     char *base;
  12.     int stacksize;
  13. }Stack;

  14. char * InitStack(Stack *S)
  15. {
  16.     S->base = (char *)malloc(sizeof(char) * STACK_INIT_SIZE);
  17.     if (!S->base)
  18.     {
  19.         printf("Can not malloc memory for stack.\n");
  20.         exit(-1);
  21.     }

  22.     S->top = S->base;
  23.     S->stacksize = STACK_INIT_SIZE;

  24.     return S->base;
  25. }

  26. void Push(Stack *S, char c)
  27. {
  28.     if ((S->top - S->base) > S->stacksize)
  29.     {
  30.          S->base = (char *)realloc(S->base, (S->stacksize + STACK_INCREMENT));
  31.          if (!S->base)
  32.          {
  33.              printf("Can not reallco memory for Stack.\n");
  34.              exit(-1);    
  35.          }

  36.          S->top = S->base + S->stacksize;
  37.          S->stacksize += STACK_INCREMENT;
  38.     }

  39.     *S->top = c;
  40.     S->top++;
  41. }

  42. int Pop(Stack *S, char c)
  43. {
  44.     if (S->top == S->base)
  45.     {
  46.         printf("The stack is empty.\n");
  47.         exit(-1);
  48.     }

  49.     c = *(--S->top);

  50.     return 1;
  51. }

  52. int IsEmpty(Stack S)
  53. {
  54.     return S.top == S.base ? 1 : 0;
  55. }

  56. char GetTop(Stack S, char *elem)
  57. {
  58.     if (S.top == S.base)
  59.     {
  60.         printf("The Stack is Empty.\n");
  61.         exit(-1);
  62.     }

  63.     *elem = *--S.top;
  64.     return *elem;
  65. }

  66. void TraverseStack(Stack S)
  67. {
  68.     while (S.top > S.base)
  69.     {
  70.         printf("%c", *--S.top);
  71.     }
  72.     printf("\n");
  73. }

  74. int IsMatch(char ch1, char ch2)
  75. {
  76.     if(ch1 == '(' && ch2 == ')')
  77.     {
  78.          return 1;
  79.     }
  80.     else if(ch1 == '[' && ch2 == ']')
  81.     {
  82.         return 1;
  83.     }else if(ch1 == '{' && ch2 == '}')
  84.     {
  85.         return 1;
  86.     }else
  87.     {
  88.         return 0;
  89.     }

  90. }


  91. int main(int argc, char const *argv[])
  92. {
  93.     Stack S;
  94.     char ch[80], *p, e;

  95.     InitStack(&S);

  96.     printf("Please enter the formula with brackets:\n");
  97.     gets(ch);

  98.     p = ch;

  99.     while (*p)
  100.     {
  101.         switch (*p)
  102.         {
  103.             case '(' :
  104.             case '[' :
  105.             case '{' :
  106.             Push(&S, *p);
  107.             break;
  108.             case ')':
  109.             case ']':
  110.             case '}':
  111.             if (IsEmpty(S))
  112.             {
  113.                 printf("Error formula, don't match.\n");    
  114.                 exit(-1);
  115.             }

  116.             if (IsMatch(GetTop(S, &e), *p))
  117.             {
  118.                 Pop(&S, e);
  119.             }
  120.             else
  121.             {
  122.                 printf("Don't match.\n");
  123.                 exit(-1);
  124.             }
  125.             default: ;
  126.         }
  127.         p++;
  128.     }

  129.     if (IsEmpty(S))
  130.     {
  131.         printf("Matched.\n");
  132.     }
  133.     else
  134.     {
  135.         printf("Error, don't match.\n");
  136.     }
  137.     
  138.     return 0;
  139. }

  140. 在写这个程序的时候,程序出错调试了很久,原因是从新写了一个GetTop函数和IsMatch函数,这两个函数写出来以后都没有进行测试就直接使用了,导致的错误。比如刚开始写的IsMatch函数:
  141. int IsMatch(char ch1, char ch2)
  142. {
  143.     if(ch1 == '(' && ch2 == ')')
  144.     {
  145.          return 1;
  146.     }
  147.     else if(ch1 == '[' && ch2 == ']')
  148.     {
  149.         return 1;
  150.     }else if(ch1 == '{' && ch2 == '}')
  151.     {
  152.         return 1;
  153.     }else
  154.     {
  155.         return 0;
  156.     }

  157. }
  158. 它有两个参数,第一个参数是左括号,第二个参数是右括号,但是在下面调用的时候,
  159. IsMatch(*p, GetTop(S, &e)),当程序执行到这里的时候,*p是右括号,而栈里面的元素是左括号,这两个参数写反了,导致了这个函数一直返回0。以后写程序的时候要注意这个问题,所有新写的函数最好都测试一遍,这样花费的时间比最后调试花费的时间少很多。

阅读(2241) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~