设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法判断其中的括号是否匹配。
问题:当输入{()}时程序提示不匹配,改了半天不知道咋改,有专家帮帮忙么
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef char Element;
struct stack
{
Element *data;
int top=-1;
};
bool is(stack s)
{
if(s.top==-1)
return true;
else
return false;
}
void push(stack &s,Element data)
{
++s.top;
s.data=new Element;
s.data[s.top]=data;
}
void pop(stack &s,Element &data)
{
if(is(s)!=true)
{
data=s.data[s.top];
s.top--;
}
}
int compare(Element *str)
{
int count=0;
Element data;
stack s;
while(str[count]!=NULL)
{
switch(str[count])
{
case'(':
push(s,str[count]);
break;
case'[':
push(s,str[count]);
break;
case'{':
push(s,str[count]);
break;
case')':
pop(s,data);
if(data!='(')
return 0;
break;
case']':
pop(s,data);
if(data!='[')
return 0;
break;
case'}':
pop(s,data);
if(data!='{')
return 0;
break;
}
count++;
}
if(is(s)==true)
return 1;
else
return 0;
}
int main()
{
Element *str;
int length,result;
cout<<"请输入算术表达式的长度:";
cin>>length;
cout<<endl;
str= new Element(length);
cout<<"请输入算法表达式:";
for(int i=0;i<length;i++)
cin>>str[i];
result=compare(str);
switch(result)
{
case 0:
cout<<"算法表达式中括号不匹配"<<endl;
break;
case 1:
cout<<"算法表达式中括号匹配"<<endl;
break;
}
system("pause");
return 0;
}
遇到({[左括号入栈,遇到)]}右括号出栈、最后判断栈是不是为空
你主要问题是不能在push()用 s.data=new Element; 每次都对s.data重新赋值
应该用一个init()初始化函数对s.data初始赋值一次
void init(stack &s,int n)
{
s.data=new Element(n);
s.top=-1;
}
void push(stack &s,Element data)
{
++s.top;
s.data[s.top]=data;
}
遇到)]}右括号时、要先判断栈是不是为空 if(is(s)) return 0;
你题目的解答代码如下:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef char Element;
struct stack
{
Element *data;
int top=-1;
};
bool is(stack s)
{
if(s.top==-1)
return true;
else
return false;
}
void init(stack &s,int n)
{
s.data=new Element(n);
s.top=-1;
}
void push(stack &s,Element data)
{
++s.top;
s.data[s.top]=data;
}
void pop(stack &s,Element &data)
{
if(is(s)!=true)
{
data=s.data[s.top];
s.top--;
}
}
int compare(Element *str)
{
int count=0;
Element data;
stack s;
init(s,100);
while(str[count]!=0)
{
switch(str[count])
{
case '(':
push(s,str[count]);
break;
case '[':
push(s,str[count]);
break;
case '{':
push(s,str[count]);
break;
case ')':
if(is(s)) return 0;
pop(s,data);
if(data!='(')
return 0;
break;
case ']':
if(is(s)) return 0;
pop(s,data);
if(data!='[')
return 0;
break;
case '}':
if(is(s)) return 0;
pop(s,data);
if(data!='{')
return 0;
break;
}
count++;
}
if(is(s)==true)
return 1;
else
return 0;
}
int main()
{
Element *str;
int i,length,result;
cout<<"请输入算术表达式的长度:";
cin>>length;
cout<<endl;
str= new Element(length);
cout<<"请输入算法表达式:";
for(i=0;i<length;i++)
cin>>str[i];
str[i]=0;
result=compare(str);
switch(result)
{
case 0:
cout<<"算法表达式中括号不匹配"<<endl;
break;
case 1:
cout<<"算法表达式中括号匹配"<<endl;
break;
}
system("pause");
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
#include <iostream>
#include <string>
#include <stack>
bool match(const std::string & s);
int main()
{
std::string line;
getline(std::cin, line);
std::cout << match(line) << std::endl;
return 0;
}
bool match(const std::string & s)
{
std::stack<char> stk;
for (int i = 0; i < (int)s.length(); ++i) {
char c = s[i];
switch (c) {
case '(':
case '[':
case '{':
stk.push(c);
break;
case ')':
if (stk.empty() || stk.top() != '(') {
return false;
}
stk.pop();
break;
case ']':
if (stk.empty() || stk.top() != '[') {
return false;
}
stk.pop();
break;
case '}':
if (stk.empty() || stk.top() != '{') {
return false;
}
stk.pop();
break;
default:
break;
}
}
return stk.empty();
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!