急!!!!数据结构,括号匹配问题

#includestdio.h#includemalloc.h#defineOK1#defineERROR0//定义顺序堆栈#defineSTACK_SIZE100//存... #include stdio.h
#include malloc.h
#define OK 1
#define ERROR 0

//定义顺序堆栈
#define STACK_SIZE 100 //存储空间初始分配量
#define STACK_INC 10 //存储空间分配增量
typedef char Elem;
typedef struct{
Elem *base; //栈底指针
Elem *top; //栈顶指针
int size; //当前已分配的存储空间
}SqStack;

typedef int Status;
//创建空堆栈,栈顶指针和栈底指针相等时,栈为空
Status CreatStack(SqStack &S)
{
S.base=(Elem *)malloc(STACK_SIZE*sizeof(Elem));
S.top=S.base;
S.size=STACK_SIZE;
return OK;
}

//堆栈是否为空
Status StackEmpty(SqStack S){
if(S.top!=S.base) return ERROR;
return OK;
}

//进栈
Status Push(SqStack &S,Elem e){
if(S.top-S.base>=S.size){ //栈满,追加存储空间
S.base=(Elem *)realloc(S.base,(S.size+STACK_INC)*sizeof(Elem));
S.top=S.base+S.size;
S.size+=STACK_INC;
}
*S.top=e;
S.top+=1;
return OK;
}

//出栈
Status Pop(SqStack &S,Elem &e){
if(S.top==S.base) return ERROR;
S.top-=1;
e=*S.top;
return OK;
}

//括号匹配
Status Bracket(SqStack &S,char *str){
int i=0,flag1=0,flag2;
Elem e;
while(str[i]!='\0'){
switch(str[i]){
case '(':Push(S,'(');break; //'('进栈
case '[':Push(S,'[');break; //'['进栈
case ')':{Pop(S,e);
if(e!='(') flag1=1; break;} //出栈,判断是否为'('
case ']':{Pop(S,e);
if(e!='[') flag1=1;break;} //出栈,判断是否为'['
default: break;
}
if(flag1) break; //出现不匹配,立即结束循环
i++;
}
flag2=StackEmpty(S); //flag2判断堆栈是否为空
if(!flag1 && flag2) printf("括号匹配!\n");
else printf("括号不匹配!\n");
return OK;
}

//主函数
void main()
{
char temp,flag='y';
while(flag=='y'){
char str[255];
SqStack S;
printf("请输入字符串:");
scanf("%s",str);
scanf("%c",&temp); //接受输入的回车键
CreatStack(S);
Bracket(S,str);
printf("你想再试一次吗(按y继续): ");
scanf("%c",&flag);
printf("\n");
}
printf("程序结束.\n");
}

输入TC中后 始终有一个错误
求高手解决....

2天后就要交报告了,求快...
1个错误在Status CreatStack(SqStack &S)
的&S上,说是语法错误
展开
 我来答
kgddqypm_wkl
推荐于2016-02-28 · TA获得超过167个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:184万
展开全部
我这有一道以前做的题,目的是一样的,可能实现方法有些不同,你看下吧,看看哪些适合你的题目就用吧

//每次输入一个扩号进行匹配
#include <iostream.h>

template <class T> class stack
{
private:
T st[100][2];
int sign;
public:
stack(int n=100) { sign=0; }

T pop()
{
T temp=st[sign-1][0];
sign--;
return temp;
}

T & top() { return st[0][0]; }

void push (const T & x)
{
st[sign][0]=x;
sign++;
}

bool empty()
{
if(sign==0)
return true;
else
return false;
}

bool Judge(T x)
{
for(int i=sign-1;i>=0;i--)
{
if((st[i][0]==int(x)-1 || st[i][0]==int(x)-2) && st[i][1]!=0)
{
cout<<"匹配"<<i+1<<endl;
st[i][1]=0;
return true;
}
}
cout<<"不匹配"<<endl;
return false;
}
};

void main()
{
stack<int> ss;

char exit=1;
while(exit!='0')
{
cin>>exit;
if(exit=='(' || exit=='[' || exit=='{')
{
ss.push(exit);
}
else
if(exit==')' || exit==']' || exit=='}')
{
ss.push(exit);
if(!ss.Judge(exit))
{
break;
}
}
else if(exit!='0')
{
cout<<"输入错误"<<endl;
}
}
}
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
cz122112
2007-12-09
知道答主
回答量:14
采纳率:0%
帮助的人:0
展开全部
楼上的你的是C++的代码,TC怎么编的过

拷贝到TC跑下看
没有细看只是格式规整了一下,函数的定义用*p来定义指针好了,别用&取地址符,正常写程序没人这么写,
程序中内存没释放,不过PC跑没问题

//定义顺序堆栈
#define STACK_SIZE 100 //存储空间初始分配量
#define STACK_INC 10 //存储空间分配增量
typedef char Elem;
typedef struct{
Elem *base; //栈底指针
Elem *top; //栈顶指针
int size; //当前已分配的存储空间
}SqStack;

typedef int Status;
//创建空堆栈,栈顶指针和栈底指针相等时,栈为空
Status CreatStack(SqStack **S)
{
*S = (SqStack *)malloc(sizeof(SqStack));
*S->base=(Elem *)malloc(STACK_SIZE*sizeof(Elem));
*S->top=*S->base;
*S->size=STACK_SIZE;
return OK;
}

//堆栈是否为空
Status StackEmpty(SqStack *S){
if(S->top!=S->base) return ERROR;
return OK;
}

//进栈
Status Push(SqStack *S,Elem e){
if(S->top-S->base>=S->size){ //栈满,追加存储空间
S->base=(Elem *)realloc(S->base,(S->size+STACK_INC)*sizeof(Elem));
S->top=S->base+S->size;
S->size+=STACK_INC;
}
S->top[0]=e;
S->top+=1;
return OK;
}

//出栈
Status Pop(SqStack *S,Elem *e){
if(S->top==S->base) return ERROR;
S->top-=1;
*e=S->top[0];
return OK;
}

//括号匹配
Status Bracket(SqStack *S,char *str){
int i=0,flag1=0,flag2;
Elem e;
while(str[i]!='\0'){
switch(str[i]){
case '(':Push(S,'(');break; //'('进栈
case '[':Push(S,'[');break; //'['进栈
case ')':{Pop(S,&e);
if(e!='(') flag1=1; break;} //出栈,判断是否为'('
case ']':{Pop(S,&e);
if(e!='[') flag1=1;break;} //出栈,判断是否为'['
default: break;
}
if(flag1) break; //出现不匹配,立即结束循环
i++;
}
flag2=StackEmpty(S); //flag2判断堆栈是否为空
if(!flag1 && flag2) printf("括号匹配!\n");
else printf("括号不匹配!\n");
return OK;
}

//主函数
void main()
{
char temp,flag='y';
while(flag=='y'){
char str[255];
SqStack *S;
printf("请输入字符串:");
scanf("%s",str);
scanf("%c",&temp); //接受输入的回车键
CreatStack(S);
Bracket(S,str);
printf("你想再试一次吗(按y继续): ");
scanf("%c",&flag);
printf("\n");
}
printf("程序结束.\n");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
2003402121
2007-12-10 · 超过24用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:44.7万
展开全部
最前面2行include代码前的‘#’要是英文的符号,把这2行代码的符号改了,程序可以正常运行啊,没有什么问题
指针也没有问题,没有动态分配何来释放指针这一说法?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式