一、题目
设计并验证以下算法:设一个算术表达式中包含圆括号、方括号和花括号,判断其中的括号是否匹配。
(1) 算术表达式中可以包含三种括号“(”和“)”、“[”和“]”、“{”和“}”,并且这三种括号可以按任意的次序嵌套使用。比如,…[…{…}[…]]…(…)…。
(2) 设置一个运算符栈OPTR。当遇到的‘(’、‘[’或‘{’时进栈;当遇到‘(’、‘[’或‘{’时,判断栈顶是否为相应的括号,若是则退栈继续执行,否则提示出错并结束。
(3) 要求由键盘输入包括‘(’、‘[’或‘{’的算术表达式。
代码如下:
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#define ARRAY_SIZE 100//数组容量
#define STACK_INIT_SIZE 10//栈空间的初始分配量
#define STACKSIZE 10//栈空间的增量
typedef struct{//字符栈
char *top;//栈顶
char *base;//栈底
int size;//栈的容量
}signstack;
int InitStack(signstack* s){//初始化栈
s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
s->top=s->base;
s->size=10;
return 1;
}
int Push(signstack* s,char elem){//进栈
if(s->top-s->base >= s->size){
s->base=(char*)realloc(s->base,(s->size+STACKSIZE)*sizeof(char));
s->top=s->base+s->size;
s->size+=STACKSIZE;
}
*(s->top)=elem;
s->top++;
}
int Pop(signstack* s){//出栈
if(s->top==s->base)
return 0;
s->top--;
return 1;
}
int IsSign(char c){//是否为括号
if(c=='('||c==')'||c=='['||c==']'||c=='{'||c=='}'||c=='#')
return 1;
else
return 0;
}
int IsLeftSign(char c){//是否为括号
if(c=='('||c=='{'||c=='[')
return 1;
else
return 0;
}
bool IsEmpty(signstack* s){//判断栈是否为空
if(s->base==s->top)
return true;
else
return false;
}
char GetTop(signstack *s)//获取栈顶元素
{
if(!IsEmpty(s))
{
char*temp=s->top;
temp--;
return *(temp);
}
else return ' ';
}
bool Compare(signstack* s,char b){//匹配是否相同
char a=GetTop(s);
if(a=='{'&&b=='}'||a=='['&&b==']'||a=='('&&b==')'||a=='#'&&b=='#')
return true;
else
return false;
}
void Output(signstack* s)
{
char* p=s->base;
for(;p<s->top;p++)
{
printf("%c ",*p);
}
printf("\n");
}
int main(){
char str[ARRAY_SIZE];
signstack sign;
InitStack(&sign);
gets(str);
int lenth=strlen(str);
str[lenth]='#';//在末尾加上#
Push(&sign,'#');
int i=0;
for(int i=0;i<=lenth+1;i++){
if(IsSign(str[i])){//是括号字符
if(IsLeftSign(str[i])){
Push(&sign,str[i]);//进栈
}
else{
if(!Compare(&sign,str[i])){//不匹配
Push(&sign,str[i]);//进栈
}
else{//匹配
Pop(&sign);//出栈
}
}
}
Output(&sign);
}
if(IsEmpty(&sign)){
printf("匹配成功");
}
else
printf("匹配失败");
return 0;
}
2.读入数据
不断输出栈内的剩余内容
–