数据结构中括号匹配问题求解

# 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;
}
大家看看这个代码哪里错了呢 谢谢了

第1个回答  2013-02-25
#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;
}
}
第2个回答  2013-02-23
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);
}
}本回答被网友采纳
第3个回答  2013-02-23
你想要的是括号匹配 怎么没有看见你的 前括号的判断 只有后括号的判断

关于数据结构(C语言版)的两个问题
如果为右括号`)`,则检查`stack`是否为空,如果不为空则弹出栈顶元素,将`top`减一。在遍历结束后,检查`stack`是否为空。如果为空,表示所有括号均匹配,返回1;否则表示存在未匹配的括号,返回0。通过上述程序,可以实现对给定字符串中括号匹配性的判断,对于数据结构(C语言版)中的括号匹配问题,...

数据结构栈应用括号匹配算法
1、如遇左括号(不论哪一种),将该左括号入栈;2、如是右括号,如栈为空则返回出错信息,不空就检查其是否与栈顶左括号是否配对,如是则栈顶元素出栈后继续扫描(转1 ),否则,返回出错信息(出错类型:右括号先出现,或左右括号不匹配,出错位置);3、如是其它字符,直接跳过,继续扫描,如表...

...判别表达式中括号是否配对的算法,采用___数据结构最佳。(1分) 顺序...
设计一个判别表达式中括号是否配对的算法,采用栈数据结构最佳如下:一、判别表达式 判别式公式:Δ=b²-4ac。根的判别式是判断方程实根个数的公式,在解题时应用十分广泛,涉及到解系数的取值范围、判断方程根的个数及分布情况等。一元二次方程ax^2+bx+c=0(a≠0)的根的判别式是b^2-4ac,...

请用JS实现一个判断字符串括号是否匹配的方法!
需求:假如我们有一个字符串:esae(dsad[dsa})dsa。我们需要判断这个字符串中的括号是否匹配的上。输入:dsad{ds(dsads)a} 输出:true 输入:asda(ds[dshd]ds(dsad])输出:false 实现思路:很多没有接触过数据结构或者不熟悉的小伙伴来说,他们的思路可能非常的硬核,比如他们可能会有如下思路:直...

C++ 数据结构 判断一个字符串中括号是否匹配
思路是遇到左括号就入栈,碰到右括号就判断栈顶的元素是否匹配的左括号,不是的话就返回false,是的话就弹出栈顶元素,然后继续下一个字符。判断函数如下:bool is_comm_stack(char const* src){ assert(src);char ch;char const* p=src;stack<char> s;while(*p){ switch(*p){ case '(':ca...

c程序设计中的括号匹配 问题描述 1.设某一算术表达式中...
问题描述1.设某一算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个算法判断其中的括号是否匹配。2.设计要求(1)程序对所输入的表达式能给出适当的提示信息,表达式中包含括号,括号分为圆括号、方括号和花括号三种类型。(2)允许使用四则混合运算(+,-,*,\/),以及包含变量的算术表达式。(3)只验证...

设计一个判别表达式中左、右括号是否配对出现的算法,
右括号是否配对出现的算法,采用栈数据结构最佳。原因: 栈是一种具有记忆能力的线性表,存取规则是先进后出,判别时遇到一个左括号时就向栈插入左括号,遇到右括号就从栈中删除一个左括号,最后若栈中没有左括号就证明括号成对,所以采用栈最适合判断表达式中括号是否成对出现。

C语言的括号匹配怎么写啊?
了解一下数据结构中的栈(其实就是后入先出),你就知道该怎么实现了。知道怎么实现栈后就很简单了:遇到左括号则入栈,遇到右括号则检查栈内是否有元素,没有元素则结果不匹配,有元素则弹出栈顶元素来查看是否符号相匹配。而检查完毕后如果栈内仍有元素,则不匹配,无元素则匹配 ...

试编写一个算法从检查一个Java语言中的大括号方括号小括号是否配对,若...
要编写用于检查 Java 程序中的大括号、方括号和圆括号是否正确匹配的算法,可以使用堆栈数据结构来跟踪代码中遇到的左大括号。例如,您可以使用以下步骤:初始化空堆栈。循环遍历 Java 程序中的字符,从第一个字符开始。如果当前字符是左大括号(即、、或),则将其推送到堆栈上。{[(如果当前字符是右大...

...右括号是否配对出现的算法,采用什么数据结构最佳。
栈 (Stack)是一种后进先出(last in first off,LIFO)的数据结构。算法基本思想:依次判断表达式中的每个字符,若是左括号就入栈,如果是右括号则出栈,出栈的时候判断是否为空,如果为空,则说明不匹对,最后读到表达式末尾没有字符了,再判断一下栈是否为空,如果为空,则说明匹配,不为空,说明不...

相似回答