魔装少男的博客

我可爱又美丽却能唤来死亡
虽然我可爱又迷人,但我能招来死亡

#include<stdio.h>

#include<stdlib.h>

#include<iostream>

using namespace std;

#define OK 1 //通过

#define ERROR 0 //错误

#define OVERFLOW -2 //堆栈溢出

#define MAXSIZE 50 //容量

typedef int Status; //函数类型,其值为状态码

typedef char ElemType; //抽象数据类型

//顺序结构储存

typedef struct

{

ElemType* base;

ElemType* top;

int stacksize;

}SqStack;

typedef enum

{

f, t

}Bool;

//初始化

Status initStack(SqStack* S)

{

S->base = new ElemType[MAXSIZE];

if (!S->base)

{

exit(OVERFLOW);

}

S->top = S->base;

S->stacksize = MAXSIZE;

return OK;

}

//判空

Bool isEmpty(SqStack* S)

{

return S->base == S->top ? t : f;

}

//长度

int getLength(SqStack* S)

{

return S->top - S->base;

}

//入栈

Status pushElem(SqStack* S, ElemType e)

{

if (getLength(S) == S->stacksize)return ERROR;

*(S->top) = e;

S->top++;

return OK;

}

//出栈

ElemType popElem(SqStack* S)

{

if (isEmpty(S))return NULL;

S->top--;

return *(S->top);

}

//取栈顶

ElemType getTop(SqStack* S)

{

if (!isEmpty(S))return *(S->top - 1);

return NULL;

}

//清空栈

Status cleanStack(SqStack* S)

{

S->top = S->base;

return OK;

}

//匹配括号

Status matchBrackets(SqStack* S)

{

bool flag = true;

char ch=NULL;//必须初始化

int i = 1;

cout << "请输入英文状态下的括号,可复制 (){}[],以#结束" << endl;

while (ch!='#'&&flag)

{

cin >> ch;

switch (ch)

{

case '(':

case '{':

case '[':

pushElem(S, ch);

break;

case ')':

if (!isEmpty(S)&&getTop(S)=='(')

{

popElem(S);

}

else

{

flag = false;

cout << ch<<"输入错误,匹配"<<i <<" ( 失败" << endl;

}

break;

case '}':

if (!isEmpty(S) && getTop(S) == '{')

{

popElem(S);

}

else

{

flag = false;

cout << ch << "输入错误,匹配" << i << " { 失败" << endl;

}

break;

case ']':

if (!isEmpty(S) && getTop(S) == '[')

{

popElem(S);

}

else

{

flag = false;

cout << ch << "输入错误,匹配" << i << " ] 失败" << endl;

}

break;

case '#':

break;

case '\n':

break;

default:

flag = false;

cout << ch;

cout << "输入非法内容\n";

break;

}

++i;

}

if (isEmpty(S) && flag)

{

cout << "匹配成功" << endl;

return OK;

}

else

{

cout << "匹配失败 "<<i-1 << endl;

cin.clear();//cin在接收到错误的输入的时候,会设置状态位good。如果good位不为1,则cin不接受输入,直接跳过。

cin.ignore(numeric_limits<std::streamsize>::max(),'\n'); //numeric_limits<std::streamsize>::max()不过是climits头文件定义的流使用的最大值 可以用一个足够大的整数代替它 清除输入缓冲区的当前行

cleanStack(S); return ERROR;

}

}

int main(void)

{

SqStack* S = new SqStack;

    initStack(S);

matchBrackets(S);//演示一排输入

cout << "第二次匹配" << endl;

matchBrackets(S);//演示一次输一个

cout << "第三次匹配" << endl;

matchBrackets(S);//演示括号匹配错误

cout << "第四次匹配" << endl;

matchBrackets(S);//演示括号匹配错误

cout << "第五次匹配" << endl;

matchBrackets(S);//演示输入错误内容

printf("\n");

system("pause");

return 0;

}