顺序栈(括号配对问题)c语言


/*一个表达式中包含两种括号,( ) [ ] ,且这两种括号可以按照任意次序嵌套使用。判别括号是否正确配对出现。
(1)扫描表达式,

(2)如果是左括号则入栈,继续扫描

(3)如果是右括号则 弹出栈顶括号 与当前右括号判断是否匹配;若匹配则继续扫描,否则返回匹配不正确,不再扫描;

(4)扫描完成后若栈为空则正确配对,否则不正确。

【样例输入1】 9+(7-3)*[9/(8-5)]#

【样例输出1】 ok

【样例输入2】 )9+(7-3)*[9/(8-5)]#

【样例输出2】 error

【样例说明】表达式内的数据项可都定义为字符型,表达式以#代表结束,
*/

 

#include<iostream>
#include<cstdlib>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -1
#define ERROR 0
#define TRUE 1
using namespace std;

typedef char SelemType;
typedef int status;
typedef struct{
SelemType *base; //基址
SelemType *top; //栈顶
int stacksize; //已分配空间的数据长度
}SqStack;

int InitStack(SqStack &s) //初始化顺序栈
{ s.base=(SelemType *)malloc(STACK_INIT_SIZE * sizeof(SelemType));
if(!s. base) return(OVERFLOW);
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return OK;
}

int Push(SqStack &S,SelemType e) //入栈
{
if(S.top-S.base>=S.stacksize) //判断栈满,若满则追加存储空间
{
S.base=(SelemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SelemType));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;// S.top指向新的S.base+S.stacksize(也有可能S.base没变)
S.stacksize+=STACKINCREMENT;
}
*S.top++=e; //先赋值然后位置再加一
return OK;
}

int Pop(SqStack &s,SelemType &e) //出栈
{
if(s.top==s.base)return ERROR; //判断是否为空栈
e=*(--s.top);
return OK;
}
int StackEmpty(SqStack s) //判栈空
{
if(s.base==s.top)return(TRUE);
else return(false);
}
void Match(SqStack &s)//判断匹配
{
SelemType x,e;
int flag=true;//记录匹不匹配
//cout<<"please input the char of the stack:";
cin>>x;
while(x!='#'&&flag==true)
{
if(x=='('||x=='[') Push(s,x);//判断入栈
else if(x==')'||x==']')
{if(StackEmpty(s))flag=false;//判断栈空
else {Pop(s,e);if((e=='('&&x==']')||(e=='['&&x==')'))flag=false;}//判断括号匹不匹配
}
cin>>x;
}
if(flag==true&&StackEmpty(s))cout<<"ok";
else cout<<"error";
}

int main()
{
SqStack s;
InitStack(s);
Match(s);
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM