#include <iostream>
#include<conio.h>
using namespace std;
#define STACK_INIT_SIZE 100 //初始存储容量
#define STACKINCERMENT 10 //存储空间增量
struct SqStack //顺序栈的定义
{
char *base; //栈底指针
char *top; //栈顶指针
int stacksize; //当前最大容量
};
bool InitStack(SqStack &S) //构造一个空栈
{
S.base=new char [STACK_INIT_SIZE]; //先给空栈分配一个初始空间
if(!S.base) return 0; //分配失败则返回0
S.top=S.base; //栈顶指针初值指向栈底指针,代表空栈
S.stacksize=STACK_INIT_SIZE; //赋予栈当前的最大容量值
return 1;
}
int GetTop(SqStack S,char &e) //若栈不空,则用e返回S的栈顶元素
{
if(S.top==S.base) return 0; //如果栈为空,则返回0
e=*(S.top-1); //如果栈不为空,则用e返回栈顶元素
return e;
}
bool Push(SqStack &S,char e) //插入元素e为新的栈顶元素
{
if(S.top-S.base>S.stacksize) //如果栈满,则给栈追加存储空间
{
S.base=new char[STACKINCERMENT];
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCERMENT;
}
if(!S.base) return 0; //如果分配失败,则返回0
*S.top=e; //把e的值赋给栈顶指针 ,可合并为 *S.top++=e; (++运算级高于*)
++S.top; //栈顶指针地址加一
return 1;
}
bool Pop(SqStack &S) //若栈不空,则删除S的栈顶元素
{
if(S.top==S.base) //若栈为空,返回0
return 0;
*(--S.top)=NULL; //把栈顶指针指向的值赋给e
return 1;
}
void kuohao(SqStack &S) //括号匹配检验
{//1
int i=0; //定义i,用于体现出错括号所在的位数
char ch=NULL,ch1=NULL; //定义两个char型变量
while(ch!='s') //当ch不为‘s’时循环不停止
{//2
cin>>ch; //输入字符
++i; // i加一
switch(ch)
{//3
case ']': //当输入的字符为']'时,检验栈顶元素是否为'['
GetTop(S,ch1);
if(ch1=='[') //是,删除当前栈顶元素
Pop(S);
else //不是,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
case')': //当输入的字符为')'时,检验栈顶元素是否为'('
GetTop(S,ch1);
if(ch1=='(') //是,删除当前栈顶元素
Pop(S);
else //不是,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
case'[': //当输入的字符为'['时,压入栈顶
Push(S,ch);
break;
case'(': //当输入的字符为'('时,压入栈顶
Push(S,ch);
break;
default: //当输入的字符为其他时,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
}//3
}//2
}//1
int main()
{
SqStack s; //定义一个栈s
InitStack(s); //初始化栈
kuohao(s);
while(1){}
delete [] s.base;
return 0;
}
#include<conio.h>
using namespace std;
#define STACK_INIT_SIZE 100 //初始存储容量
#define STACKINCERMENT 10 //存储空间增量
struct SqStack //顺序栈的定义
{
char *base; //栈底指针
char *top; //栈顶指针
int stacksize; //当前最大容量
};
bool InitStack(SqStack &S) //构造一个空栈
{
S.base=new char [STACK_INIT_SIZE]; //先给空栈分配一个初始空间
if(!S.base) return 0; //分配失败则返回0
S.top=S.base; //栈顶指针初值指向栈底指针,代表空栈
S.stacksize=STACK_INIT_SIZE; //赋予栈当前的最大容量值
return 1;
}
int GetTop(SqStack S,char &e) //若栈不空,则用e返回S的栈顶元素
{
if(S.top==S.base) return 0; //如果栈为空,则返回0
e=*(S.top-1); //如果栈不为空,则用e返回栈顶元素
return e;
}
bool Push(SqStack &S,char e) //插入元素e为新的栈顶元素
{
if(S.top-S.base>S.stacksize) //如果栈满,则给栈追加存储空间
{
S.base=new char[STACKINCERMENT];
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCERMENT;
}
if(!S.base) return 0; //如果分配失败,则返回0
*S.top=e; //把e的值赋给栈顶指针 ,可合并为 *S.top++=e; (++运算级高于*)
++S.top; //栈顶指针地址加一
return 1;
}
bool Pop(SqStack &S) //若栈不空,则删除S的栈顶元素
{
if(S.top==S.base) //若栈为空,返回0
return 0;
*(--S.top)=NULL; //把栈顶指针指向的值赋给e
return 1;
}
void kuohao(SqStack &S) //括号匹配检验
{//1
int i=0; //定义i,用于体现出错括号所在的位数
char ch=NULL,ch1=NULL; //定义两个char型变量
while(ch!='s') //当ch不为‘s’时循环不停止
{//2
cin>>ch; //输入字符
++i; // i加一
switch(ch)
{//3
case ']': //当输入的字符为']'时,检验栈顶元素是否为'['
GetTop(S,ch1);
if(ch1=='[') //是,删除当前栈顶元素
Pop(S);
else //不是,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
case')': //当输入的字符为')'时,检验栈顶元素是否为'('
GetTop(S,ch1);
if(ch1=='(') //是,删除当前栈顶元素
Pop(S);
else //不是,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
case'[': //当输入的字符为'['时,压入栈顶
Push(S,ch);
break;
case'(': //当输入的字符为'('时,压入栈顶
Push(S,ch);
break;
default: //当输入的字符为其他时,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
}//3
}//2
}//1
int main()
{
SqStack s; //定义一个栈s
InitStack(s); //初始化栈
kuohao(s);
while(1){}
delete [] s.base;
return 0;
}