使用指向静态容器的指针在堆中推送对象

时间:2017-09-04 04:51:57

标签: c++ static stl stack

class Node_Str{
public:
string name;
string value;
string type;
Node_Str(string name,string value,string type){
name=name;
value=value;
type=type;}};    

static stack<Node_Str> s;
void find_token(string input){
int cursor=0;
string current="";
while(cursor<input.length()){
char value;
value=input[cursor];
cout<<value<<endl;
if(value=='('||value==')'||value=='+'||value=='-
'||value=='*'||value=='/'){
Node_Str* p=new Node_Str("pare",string(1,value),"Pare");
s.push(*p);
cursor++;
delete p;}
if(value==' '){
cursor++;
}
if(value=='1'||value=='2'||value=='3'||value=='4'){
Node_Str* p=new Node_Str("num",string(1,value),"Number");
s.push(*p);
cursor++;
delete p;}}}
int main(){
while(!s.empty()){
cout<<s.top().value<<" ";
s.pop();   }
return 0; }

find_token函数应该用白色空格分隔输入字符串,并用该字符串的值构造Node_Str对象。然后在 主要功能,我想打印出来。人物是有限的。只是'1','2','3','4','+',' - ','*','/'。 输入为4 + 4,输出应为4 + 4。但是,没有输出。

2 个答案:

答案 0 :(得分:0)

评论已经说过关于内存泄漏和忘记调用find。

除此之外,堆栈是一个容器,其中最后被推入的容器将是第一个被弹出的容器。为了输出0 1 2 3,你需要按照3 2 1 0的顺序推入堆栈。

只是提供更好的版本。

#include <iostream>
#include <stack>

using std::cout;
using std::stack;

static stack<int> s;

void find()
{
    int* p;
    for (int i = 3; i >= 0; i--) {
        p = new int(i);
        s.push(*p);
        delete p; // p itself does not have to be returned so it can be safely deleted here
        //This can also ne replaced by directly using s.push(i)
    }
}

int main() {
    find();
    while (!s.empty()) 
    {
        cout << s.top() << " ";
        s.pop();
    }
    return 0;
}

答案 1 :(得分:0)

根据leyanpan的建议,数据应按相反的顺序推送,以获得所需的输出。还有一点是不需要为int类型进行动态分配。将非数组内置类型存储在堆栈而不是堆中总是更好。 将堆栈数据结构分配为静态变量也会将范围扩展到程序终止。最好将堆栈对象用作main中的局部变量,并将其作为函数find的引用参数传递。