问题:
输入一个符号组,如:"()[]{}"。判断该输入是否合法。
函数功能:
symbolJudge函数:
判断符号函数判断一下预压入栈内的符号与栈顶符号是否为一对。
若为一对,则弹出栈顶符号,返回0,表示压栈操作不执行。
若非一对,则需要压入栈内,返回1,表示压栈操作执行。
注:
我在写代码的时候没有加入过多的判断语句,例如:栈底如果是“}、)、>”这些符号的时候,直接结束程序,报符号组不合法。读者有这个需求的话,可自行添加。栈的容量我只设置了20个,读者如果需要扩展栈容量的话,自行添加代码。
判断符号是否匹配的时候,可以对照ASCII表,因为这些符号组在表内对应的十进制数大多都有规律,依照这个规律可以大大减少代码量。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 20
typedef int Status;
typedef char ElemType;
typedef struct sqStack
{
ElemType *top;
ElemType *base;
int stackSize;
} sqStack;
void stackInit(sqStack *stack);
void destroyStack(sqStack *stack);
void Push_Pop(sqStack *stack, ElemType e);
Status symbolJudge(sqStack *stack, ElemType e);
void stackInit(sqStack *stack)
{
stack->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!stack->base)
{
printf("初始化失败!\n");
exit(1);
}
stack->top = stack->base;
stack->stackSize = STACK_INIT_SIZE;
}
/*
判断符号函数
判断一下预压入栈内的符号与栈顶符号是否为一对。
若为一对,则弹出栈顶符号,返回0,表示压栈操作不执行。
若非一对,则压入栈内,返回1,表示压入栈内。
*/
Status symbolJudge(sqStack *stack, ElemType e)
{
ElemType last; // 记录栈顶元素
if (stack->top == stack->base)
{
// 说明栈为空
return TRUE;
}
/*
使用--stack->top 拿到栈顶符号,判断得如果符号是一对,
那么--stack->top 就已经相当于 把栈顶元素弹出了。
*/
last = *(--stack->top);
if (e == last || e-1 == last || e-2 == last) // 判断符号是否为一对
{
// 说明栈顶符号与预压入栈的符号是一对。
return FALSE;
}
stack->top++;
return TRUE;
}
/*
执行压栈或弹出的函数
压栈前先判断一下栈内最顶部的符号与预压入栈的符号是否为一对。
若为一对,则将栈顶符号弹出。
否则,压入栈内。
*/
void Push_Pop(sqStack *stack, ElemType e)
{
int flag = symbolJudge(stack, e);
if (flag)
{
*(stack->top) = e;
stack->top ++;
}
}
// 销毁栈
void destroyStack(sqStack *stack)
{
free(stack->base);
stack->base = stack->top = NULL;
stack->stackSize = 0;
printf("栈已销毁!\n");
}
int main(void)
{
char input;
sqStack stack;
stackInit(&stack);
printf("输入符号组(#为结束符):");
do
{
scanf("%c", &input);
if (input != '#') Push_Pop(&stack, input);
} while (input != '#');
getchar(); // 清空缓冲区
if (stack.top - stack.base == 0)
{
printf("符号组合法!\n");
}
else
{
printf("符号组不合法!\n");
}
destroyStack(&stack);
return 0;
}
运行结果:
例(1)
输入符号组(#为结束符):"["]{([])}#
符号组不合法!
栈已销毁!
例(2)
输入符号组(#为结束符):"[]{("{}")}"#
符号组合法!
栈已销毁!