关于括号匹配问题!

/*
 括号匹配问题。
 思想:括号分为(,[,],)四种。当遇见左括号时将其压入栈,当遇见右括号时有两种情况。
第一种是该右括号与栈顶的括号想匹配。第二种是该括号不合法,就是括号不匹配。开始时,
栈为空,当一对括号发生匹配时,将左括号取出。所以结束时,栈也为空。
*/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define InitSize 100  //定义初始存储空间大小
#define Size 100  //定义新增存储空间的大小
#define MAX 100
//定义结构体
typedef struct Stack
{
 int* top;
 int* base;
 int stacksize;
}SqStack;

//建立一个空栈
void InitStack(SqStack *s)
{
 s->base = (int *)malloc(InitSize * sizeof(int));
 if(!s->base) printf("分配失败!\n");
 s->top = s->base;
 s->stacksize = InitSize;
}

//入栈
void Push(SqStack *s, int e)
{
 if(s->top - s->base >= s->stacksize)
 {
  s->base = (int *) realloc (s->base, (s->stacksize+Size)*sizeof(int));
  s->top = s->base + s->stacksize;
  s->stacksize += Size;
 }
 *(s->top) = e;
 s->top++;
}

//取栈顶元素
int getTop(SqStack *s)
{
 int e;
 if(s->base == s->top)
 {
  return 0;
 }
 e = *(s->top-1);
 return e;
}

//删除栈顶元素
int Pop(SqStack *s)
{
 //int e;
 if(s->top == s->base)
 {
  return 0;
 }
 s->top --;
 //e = *(--s->top);
 //return e;
}

int main()
{
 //使用字符数组来定义字符串,用strlen来求字符串的长度
 char str[MAX];
 int i, e;
 SqStack s;  //定义结构体变量
 printf("请输入要检测的括号对:");
 scanf("%s", str);
 
 InitStack(&s);
 
 for(i=0; i<strlen(str); i++)
 {
  if(str[0] ==')' || str[0]==']')
  {
   printf("括号不匹配!");
   break;
  }
  if(str[i] == '(' ||str[i] == '[') Push(&s,str[i]);
  else if(str[i] ==')' || str[i]==']')
  {
   e = getTop(&s);
   //printf("%c", e);
   if(e != 0)
   {
    if(e == '(' && str[i] ==')')
    {
     Pop(&s);
    }
    else if(e == '[' && str[i] ==']')
    {
     Pop(&s);
    }
    else
    {
     printf("括号不匹配!\n");
     break;
    }
   }
  }
  else
  {
   printf("输入错误!");
   break;
  }
 }
 //printf("%d,%d", i,strlen(str)-1);
 //这里i的值,要分清for循环执行完后,i的值。
 if(getTop(&s)==0 && i==strlen(str) && i) printf("括号匹配!\n");
 return 0;
}

posted @ 2013-10-29 16:24  第十届电视剧  阅读(194)  评论(0编辑  收藏  举报