
数据结构中括号匹配问题求解 5
#include<iostream>usingnamespacestd;typedefstruct//定义栈{char*base;char*top;intsize;}st...
# include <iostream>
using namespace std;
typedef struct // 定义栈
{
char *base;
char *top;
int size;
}stack;
void inite (stack &S) //初始化
{
S.base = (char *)malloc (S.size *sizeof (char));
S.top = S.base ;
S.size = 100;
}
void push (stack &S,char e) // 进栈
{
if (S.top-S.base >= S.size)
return ;
*S.top++ = e;
}
void pop (stack &S,char &e)// 出栈
{
if (S.base == S.top )
return ;
e = * --S.top ;
}
int isempty (stack &S) // 判空
{
if (S.base == S.top )
return 1;
else
return 0;
}
int main ()
{
char e;
stack S;
inite (S);
char ch[100];
char *p = ch;
cout<<"请输入括号"<<endl;
cin>>ch;
while (*p++ != '\0')
{
if (*p++ == ']' || *p++ == ')')
return 0;
else
if (*p++ == *S.top )
pop (S,e);
else
{
e = *p;
push (S,e);
}
}
if (isempty (S) == 1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
大家看看这个代码哪里错了呢 谢谢了 展开
using namespace std;
typedef struct // 定义栈
{
char *base;
char *top;
int size;
}stack;
void inite (stack &S) //初始化
{
S.base = (char *)malloc (S.size *sizeof (char));
S.top = S.base ;
S.size = 100;
}
void push (stack &S,char e) // 进栈
{
if (S.top-S.base >= S.size)
return ;
*S.top++ = e;
}
void pop (stack &S,char &e)// 出栈
{
if (S.base == S.top )
return ;
e = * --S.top ;
}
int isempty (stack &S) // 判空
{
if (S.base == S.top )
return 1;
else
return 0;
}
int main ()
{
char e;
stack S;
inite (S);
char ch[100];
char *p = ch;
cout<<"请输入括号"<<endl;
cin>>ch;
while (*p++ != '\0')
{
if (*p++ == ']' || *p++ == ')')
return 0;
else
if (*p++ == *S.top )
pop (S,e);
else
{
e = *p;
push (S,e);
}
}
if (isempty (S) == 1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
大家看看这个代码哪里错了呢 谢谢了 展开
3个回答
展开全部
#include <iostream>
using namespace std;
typedef struct node{
char data;
struct node *next;
node():data(0),next(NULL){};//这句是初始化数据,编程养成好习惯会避免不必要的错误,可以解决编译中的警告
}stacknode;
typedef struct {
stacknode *top;
}linkstack;
void init(linkstack& s)
{
s.top=NULL;
}
void push(linkstack& ls,char x)//既然是函数要修改参数,要不就用引用,要不就用指针
{
stacknode *s;
s=new stacknode;
s->data=x;
s->next=ls.top;
ls.top=s;
}
void pop(linkstack& ls)
{
if(ls.top==NULL)
cout<<"这是空栈:"<<endl;
else{
char x;
stacknode *p;//=new stacknode;出站还自己申请空间??
x=ls.top->data;
p=ls.top;
ls.top=p->next;
delete p;//删除空间啊,要不频繁的出战入栈内存还不爆炸啊
p=NULL;
cout<<"栈顶元素是:"<<x<<endl;
}
}
void main()
{
// stacknode *s=new stacknode;此句没用
linkstack ls;
int i;
init(ls);
cout<<"1.入栈:"<<endl;
cout<<"2.出栈:"<<endl;
cout<<"请选择";
cin>>i;
while(i!=0)
{
cout<<"请选择";
switch(i)
{
case 1:
cout<<"请输入要入栈的字符,用!做结束符"<<endl;
char x;
cin>>x;
while(x!='!')
{
push(ls, x);
cin>>x;
}
break;
case 2:
pop(ls);
break;
}
cout<<"请继续选择:";
cin>>i;
}
}
using namespace std;
typedef struct node{
char data;
struct node *next;
node():data(0),next(NULL){};//这句是初始化数据,编程养成好习惯会避免不必要的错误,可以解决编译中的警告
}stacknode;
typedef struct {
stacknode *top;
}linkstack;
void init(linkstack& s)
{
s.top=NULL;
}
void push(linkstack& ls,char x)//既然是函数要修改参数,要不就用引用,要不就用指针
{
stacknode *s;
s=new stacknode;
s->data=x;
s->next=ls.top;
ls.top=s;
}
void pop(linkstack& ls)
{
if(ls.top==NULL)
cout<<"这是空栈:"<<endl;
else{
char x;
stacknode *p;//=new stacknode;出站还自己申请空间??
x=ls.top->data;
p=ls.top;
ls.top=p->next;
delete p;//删除空间啊,要不频繁的出战入栈内存还不爆炸啊
p=NULL;
cout<<"栈顶元素是:"<<x<<endl;
}
}
void main()
{
// stacknode *s=new stacknode;此句没用
linkstack ls;
int i;
init(ls);
cout<<"1.入栈:"<<endl;
cout<<"2.出栈:"<<endl;
cout<<"请选择";
cin>>i;
while(i!=0)
{
cout<<"请选择";
switch(i)
{
case 1:
cout<<"请输入要入栈的字符,用!做结束符"<<endl;
char x;
cin>>x;
while(x!='!')
{
push(ls, x);
cin>>x;
}
break;
case 2:
pop(ls);
break;
}
cout<<"请继续选择:";
cin>>i;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
while (*p++ != '\0') //这里比较之后p就指向了下一个符号了哇, 指针后移在下面适当增加
{
if (*p++ == ']' || *p++ == ')') //这里的你意思是否为 第一个符号若是右括号,则不匹配呢?
//然而在这里却是 当p所指向的字符为右括号的话,就退出
return 0;
else
if (*p++ == *S.top ) //由此循环看不出,要入栈的是什么哦,应改为
//if (((*p==']') && (*S.top=='[')) || ((*p==')') && (*S.top=='(')))
pop (S,e);
else
{
e = *p;
push (S,e);
}
}
{
if (*p++ == ']' || *p++ == ')') //这里的你意思是否为 第一个符号若是右括号,则不匹配呢?
//然而在这里却是 当p所指向的字符为右括号的话,就退出
return 0;
else
if (*p++ == *S.top ) //由此循环看不出,要入栈的是什么哦,应改为
//if (((*p==']') && (*S.top=='[')) || ((*p==')') && (*S.top=='(')))
pop (S,e);
else
{
e = *p;
push (S,e);
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你想要的是括号匹配 怎么没有看见你的 前括号的判断 只有后括号的判断
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询