- /*
- * Copyright (c) 2016, 烟台大学计算机与控制工程学院
- * All rights reserved。
- * 文件名称 :1.cpp
- * 作 者 :杨俊杰
- * 完成日期 :2016年 10月8日
- * 版 本 号 :v1.0
- *
- * 问题描述 :假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。
- * 输入描述 :2+(3+4)*[2+{[3]}]-8;2+(3+4*[2)+{[3]}-8;
- * 输出描述 :匹配正确;匹配错误。
- */
- //1.头文件:sqstack.h,包含定义顺序栈数据结构的代码、宏定义、要实现算法的函数的声明;
- #ifndef SQSTACK_H_INCLUDED
- #define SQSTACK_H_INCLUDED
- #define MaxSize 100
- typedef char ElemType;
- typedef struct
- {
- ElemType data[MaxSize];
- int top; //栈指针
- } SqStack; //顺序栈类型定义
- void InitStack(SqStack *&s); //初始化栈
- void DestroyStack(SqStack *&s); //销毁栈
- bool StackEmpty(SqStack *s); //栈是否为空
- int StackLength(SqStack *s); //返回栈中元素个数——栈长度
- bool Push(SqStack *&s,ElemType e); //入栈
- bool Pop(SqStack *&s,ElemType &e); //出栈
- bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素
- void DispStack(SqStack *s); //输出栈
- #endif // SQSTACK_H_INCLUDED
- //2.源文件:sqstack.cpp,包含实现各种算法的函数的定义
- #include <stdio.h>
- #include <malloc.h>
- #include "sqstack.h"
- void InitStack(SqStack *&s)
- {
- s=(SqStack *)malloc(sizeof(SqStack));
- s->top=-1;
- }
- void DestroyStack(SqStack *&s)
- {
- free(s);
- }
- int StackLength(SqStack *s) //返回栈中元素个数——栈长度
- {
- return(s->top+1);
- }
- bool StackEmpty(SqStack *s)
- {
- return(s->top==-1);
- }
- bool Push(SqStack *&s,ElemType e)
- {
- if (s->top==MaxSize-1) //栈满的情况,即栈上溢出
- return false;
- s->top++;
- s->data[s->top]=e;
- return true;
- }
- bool Pop(SqStack *&s,ElemType &e)
- {
- if (s->top==-1) //栈为空的情况,即栈下溢出
- return false;
- e=s->data[s->top];
- s->top--;
- return true;
- }
- bool GetTop(SqStack *s,ElemType &e)
- {
- if (s->top==-1) //栈为空的情况,即栈下溢出
- return false;
- e=s->data[s->top];
- return true;
- }
- void DispStack(SqStack *s) //输出栈
- {
- int i;
- for (i=s->top;i>=0;i--)
- printf("%c ",s->data[i]);
- printf("\n");
- }
- #include <stdio.h>
- #include "sqstack.h"
- int main()
- {
- char c;
- char st[50];
- int d=1, i;
- SqStack *s;
- InitStack(s);
- printf("请输入表达式:");
- scanf("%s", st);
- for(i=0; st[i]!='\0'&&d; i++)
- {
- switch(st[i])
- {
- case'(':
- case'[':
- case'{':
- Push(s, st[i]);
- break;
- case')':
- Pop(s, c);
- if(c!='(') d=0;
- break;
- case']':
- Pop(s, c);
- if(c!='[') d=0;
- break;
- case'}':
- Pop(s,c);
- if(c!='{') d=0;
- break;
- }
- }
- if(StackEmpty(s)&&d==1)
- printf("配对正确!!\n");
- else
- printf("配对错误!!\n");
- return 0;
- }
运算结果: