问题描述
设计算法判断一个算数表达式的圆括号是否正确匹配.
思路
不难想到,这里存储括号用栈(先进后出)比较好。又因为存储的是字符,所以用顺序栈最为合理。(如果用链栈,一个节点存储一个字符,一个字符占一个字节,而一个地址占用4个字节,不合理)
对表达式进行扫描,凡遇到’(’就入栈,遇到’)’就将栈顶元素‘(’出栈;表达式被扫描完毕,栈应为空。
代码
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define maxlen 100
typedef struct
{
char data[maxlen];
int top;
}SeqStack;
//建空栈
SeqStack * SetStack()
{
SeqStack * S;
S = (SeqStack *)malloc(sizeof(SeqStack));
S->top = -1;
return S;
}
//判栈空
int StackEmpty(SeqStack * S)
{
if (S->top >= 0)
return 0;
else
return 1;
}
//判栈满
int StackFull(SeqStack *S)
{
if (S->top< maxlen-1 && S->top >=0)
return 0;
else
return 1;
}
//取栈顶元素
char getTop(SeqStack *S)
{
if (S->top <= maxlen-1 && S->top >= 0)
return (S->data[S->top]);
else printf("error");
}
//入栈
void Push(SeqStack * S, char x)
{
if (S->top < maxlen-1 && S->top >= -1)
{
S->top++;
S->data[S->top] = x;
}
else
printf("error");
}
//出栈
void Pop(SeqStack * S)
{
if (S->top >= 0)
S->top--;
else
printf("error");
}
//判断左括号
int isLeftBracket(char ch)
{
if (ch == '(')
return 1;
else
return 0;
}
//判断右括号
int isRightBracket(char ch)
{
if (ch == ')')
return 1;
else
return 0;
}
int check(SeqStack * S, char str[])
{
int i;
int len = strlen(str);
for (i = 0; i < len; ++i)
{
if (isLeftBracket(str[i]))
Push(S, str[i]);
else if (isRightBracket(str[i]))
{
if (StackEmpty(S))
return 0;
else
Pop(S);
}
}
if (StackEmpty(S))
return 1;
else
return 0;
}
int main(void)
{
char str[maxlen];
scanf("%s", str);
SeqStack *S = SetStack();
if (check(S, str))
printf("算数表达式的圆括号匹配正确\n");
else
printf("算数表达式的圆括号匹配错误\n");
return 0;
}