张超q
可能老师没讲清楚题意,我理解是 这个括号匹配是按 运算时候的括号 来要求的,即 成对的括号内才能套着成对的括号。比如【7+(6+(2+【1+2】))】 而不能 【(】【)】 这样就无法运算了
慕粉4170504
括号的匹配指的应该是按照成对原则出现进行匹配,出现的顺序是有先后顺序的,按照中文中括号的使用进行判断的
MT灬柴郡
无法理解问题
潇潇_暮雨
// myself void bracketMatch1(const char* str) { MyStack<char>* pMatch = new MyStack<char>(30); char currentNeed = 0; for (int i = 0; i < strlen(str); i++) { if (str[i] == currentNeed) { if (pMatch->pop(currentNeed) == 0) currentNeed = 0; // 1. 通过pMatch更新当前待匹配括号 // 2. pMatch为空时,需给当前待匹配括号置零 } else { if (currentNeed != 0) pMatch->push(currentNeed); currentNeed = str[i] == '(' ? ')' : (str[i] == '[' ? ']' : 'k'); } } pMatch->stackEmpty()&¤tNeed==0 ? cout << "Yes" << endl : cout << "No" << endl; delete pMatch; pMatch = nullptr;}
格调_moment1
兄弟,找着你的错误了,在for循环里,每次拿取的str[i]和currentNeed相比较,如果不相等,就需要把str[i]压入栈pStack中,到这一步你还是正确的。但是接下来当currentNeed!=0时,需要把currentNeed压入栈pNeedStack中时,你却压入到了pStack栈中了。

只需要把pStack->push修改为pNeedStack->push即可。
慕沐6276351
其实说白了一个栈就足够解决这个问题了,老师写这些应该是为了后续扩展的需要吧
BingBing_Elf
用例是 实例化一个对(并非实例化多个)象,析构函数是释放数组(因为申请了N个内存)。
qq_进_9
试过了可以
qq_Toloveyousel_0
前面if判断了str【i】和上一次currentneed相等,刚刚好跳过了
潇慕粉
因为你是先入栈再赋值need。第一次循环的时候,need==0,所以直接need = ']',pNeed里有],第二次循环need==),然后满足条件。
case'[':
if (need != 0){
cout << "第" << i + 1 << "次入另一个栈:";
pNeed->push(need);
cout << need<<endl;
}
need = ']';
break;
慕粉13733439977
可以啊 栈可以实现前缀中缀后缀运算 这个可以去查一查看看
Secnull
#include <iostream>
#include "Stack.h"
using std::string;
using std::cout;
using std::endl;
/**
* 检测字符串中的括号是否匹配
* @param str 待检测匹配的字符串
* @param tps1 匹配的符号
* @param tps2 与tps1相匹配且顺序一致的符号
* @return 括号是否匹配的布尔值
*/
bool isPaired(string str, string tps1, string tps2);
int main() {
string s = "int main(){func(){while(true){cout << endl}}}"; //待检测字符串
string msg;
msg = isPaired(s, "({[", ")}]") ? "OK" : "No";
cout << msg << endl;
return 0;
}
bool isPaired(string str, string tps1, string tps2) {
Stack<char> stack(str.length() / 2); //如果字符串中的括号匹配,最差情况下栈需要的长度等于字符串长度的一半
int tps_pos;
char tmp;
for (char i : str) {
if (tps1.find(i) != -1) { //栈存储字符串中的左括号
if (stack.isFull())
return false;
stack.push(i);
} else if ((tps_pos = tps2.find(i)) != -1) {
if (stack.isEmpty())
return false;
stack.pop(tmp);
if (tps1[tps_pos] != tmp) { //判断字符串的某一右括号字符对应匹配的左括号是否与当前pop出的元素是否一致
return false;
}
}
}
return stack.isEmpty(); //判断是否栈空,如果栈为空则说明匹配完毕,如果未空则说明有括号未匹配
}
墓男神
老师讲的用两个栈的没有听懂,自己想了一个办法,望采纳
Mystack<char>*pmystack=new Mystack<char>(50);
char str[]="[{()({{}}())}](([{}])){[([])]}{}()";
pmystack->Push(str[0]);//让第一个字符入栈
for(int i=1;i<strlen(str);i++)//从第二个字符开始扫描
{
if((pmystack->m_pBuffer[pmystack->m_iTop-1]=='('&&str[i]==')')||(pmystack->m_pBuffer[pmystack->m_iTop-1]=='['&&str[i]==']')||(pmystack->m_pBuffer[pmystack->m_iTop-1]=='{'&&str[i]=='}'))//如果当前扫描的字符与栈顶的前一个字符相匹配,则出栈
{
pmystack->Pop();
}
else//如果不符合就入栈
{
pmystack->Push(str[i]);
}
}
if(pmystack->stackEmpty())//如果扫面玩所有的字符栈为空,则说明全部匹配完毕
cout<<"该字符串为匹配的括号"<<endl;
else
cout<<"该字符串为不匹配的括号"<<endl;
delete pmystack;
pmystack=NULL;
Lydia_Lv
如果if(!pNeedStack->pop(currentNeed)){currentNeed=0;} 括号里面的条件是false,就相当于!pNeedStack->pop(currentNeed) 这句话是错的,注意前面的“!”,这句话要是错的,那么pNeedStack->pop(currentNeed) 就为真, 这句话本身也是一个出栈的操作,所以说,如果是真的话,会有东西出栈的,存到了currentNeed中。