1)将句子读成矢量。
2)将矢量堆叠成堆栈>
3)找到两者的位置“(”
和“)”
4)删除元素并替换为“(删除)”
矢量
5)输出向量。
即。输入“这是(a)duck”,输出应为“this is(deleted)duck”。提前谢谢。
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int main ()
{
cout<<"please enter a series of words with parenthes"<<endl;
vector<string> svec;
string word;
while (cin>>word)
svec.push_back(word);
stack<string, vector<string> > strStack(svec);
vector<string>::iterator pos1 ,pos2;
for (vector<string>::iterator counter=svec.end(); strStack.empty()==false; --counter)
{
if(strStack.top()==")") pos1=counter-1;
if(strStack.top()=="(") { pos2=counter-1; break; }
strStack.pop();
}
svec.insert(svec.erase(pos2,pos1),"(deleted)");
for(vector<string>::iterator iter=svec.begin(); iter!=svec.end(); )
cout<<*iter++<<" "<<flush;
return 0;
}
对不起。输出是:我认为问题是堆栈&gt; strStack(SVEC); 因为我无法堆叠;上面的代码应该没问题(我知道了);
please enter a series of words with parenthes
this is (a) duck
Segmentation fault
答案 0 :(得分:2)
你的代码被破坏了:它只处理一些非常具体的案例,即当只有一个括号的单个单词时。如果做不到这一点,你永远不会分配pos1
和pos2
,导致我们心爱的“未定义的行为”。
至少,确保您永远不会使用未初始化的变量(#1)。作为奖励,我们检查是否有匹配(#2):
vector<string>::iterator pos1 = svec.end(), pos2 = pos1; // #1: never uninitialized
// ...
if (pos1 != pos2) // #2: only if we found something
svec.insert(svec.erase(pos2,pos1),"(deleted)");