1.问题
假设表达式中允许包含两种括号
[ ]
和( )
,我们检验在表达式中是否是正确的格式,比如3+[3*(2-1)+1]
是正确的格式,但是要是3+[(2+1])+1
就不是正确的格式,那么我们如何进行检验呢
2.算法实现步骤
- 初始化一个空栈S
- 设置一个标记性变量flag,用来标记匹配结果以控制循环及返回结果,1表示正确的匹配.表示错误的匹配,flag的初始值为1
- 扫描表达式依次读入字符ch,如果表达式扫描完毕且flag非0,则循环执行以下操作
- 若ch为‘[’或者‘(’则将其压入栈中
- 若ch是‘)’则根据当前栈顶元素得到值分情况考虑,若栈顶元素是‘(’那么正确匹配,否则错误匹配,将flag置为0
- 若ch是‘]’则根据当前栈顶元素得到值分情况考虑,若栈顶元素是‘[’那么正确匹配,否则错误匹配,将flag置为0
- 退出循环后,如果栈空且flag为1,那么匹配正确,否则匹配错误
3.代码详解
#include<iostream>
using namespace std;
#define MAXSIZE 100
#define SElemType int
#define Status int
#define OK 1
#define ERROR 0
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)//初始化栈
{
S.base=new SElemType[MAXSIZE];
if(!S.base)
exit(0);
S.