我正在玩堆栈以更好地理解概念和实现,我偶然发现了一个奇怪的错误。我将一个字符串传递给一个函数,将字符串分解为单个字符串并将它们添加到堆栈中,但是当我打印堆栈时,它不是我输入的数据。
我修复了错误(我将其评论为重新创建错误),但我很好奇为什么会发生这种情况,错过匹配的输出是不变的,永远不会改变。
#include "stack.h"
#include <string>
#include <iostream>
using namespace std;
void bracketCheck(const std::string& s){
Stack<char> stack;
// this works as expected:
/*for (auto i = s.begin(); i != s.end(); i++){
stack.push(*i);
cout << stack.top() << endl;
}*/
//this gives a jumbled outout:
for (auto i = s.front(); i != s.back(); i++){
stack.push(i);
cout << stack.top() << endl;
}
}
void main(){
string a = "stanley";
bracketCheck(a);
system("pause");
}
stack.h:
#include <list>
using namespace std;
template<class T>
class Stack{
private:
list<T> data_;
public:
Stack(){}
void push(const T& data){
//v1
data_.push_front(data);
}
T top() const{
list<T>::const_iterator it = data_.begin();
return *it;
}
};
我得到的输出:
s
t
u
v
w
x
答案 0 :(得分:2)
string::front()
函数返回对字符串前面的实际字符的引用。通过使用for (auto i = s.front(); i != s.back(); i++)
循环,您实际上会递增字符串本身的内容,而不是循环遍历字符串的索引。
实际上非常搞笑。你非常非常幸运的是,递增s
6次最终会在y
,这恰好是你实际使用的字符串的最后一个字符。因此,恰好满足for循环(i != s.back()
)的中断条件。幸运的休息。如果字符串几乎是其他任何东西,那么你会得到更严重的崩溃。
答案 1 :(得分:2)
字符串方法front()
和back()
返回对字符串的第一个和最后一个字符的引用(引用char),输入字符串是&#39; stanley&#39;,现在查看ASCII代码table,s
十进制为115,y为十进制121
,为循环创建,打印范围[115,121]中的所有值。