2017-07-31 61 views
1

嗨,我是新來的c + +,並無法理解如何推動和彈出元素讀取從文本文件到數組,並顯示這些元素以相反的順序,例如,如果我有一個文本文件名爲hero.txt與元素悟空路飛火影忍者我想輸出是路飛火影忍者悟空 這是我迄今爲止如何將從文本文件中讀取的元素壓入或彈出到C++中的數組中,並按快速轉換順序輸出堆棧?

string hero[100]; // array to store elements 
    int count=0; 

    int main() 
    { 
     fstream myfile; 
     string nameOffile; 
     string text; 
     string mytext; 
     cout << "Enter name of file" << endl; 
     cin >> nameOffile 
     myfile.open(nameOffile.c_str()); 
      if (!myfile) 
      { 
       cerr << "error abort" << endl; 
       exit(1); 
      } 
      while (myfile >> text) 
      { 

       Push(mytext); //Note I know this is wrong I just don't know how to write it in a manner that will push the first element of the textfile to the top 


      } 

     myfile.close(); 

     while(hero[count]=="") 
     { 
//Again I know these two lines are incorrect just don't know how to implement in correct manner 


      cout <<hero[0] << " " <<endl; 
      Pop(mytext); 


     } 

    } 

// Function for push 
void Push(string mytext) 
{ 
    count = count + 1; 
    hero[count] = mytext; 

} 

void Pop(string mytext) 
{ 
    if(count=0) 
    { 
     mytext = " "; 

    } 
    else 
    { 
     mytext = hero[count]; 
     count = count - 1; 
    } 

} 
+0

見http://en.cppreference.com/w/cpp/container/stack。這是一個模板類,所以在聲明它爲'std :: stack mystack'後,你可以使用它作爲'mystack.push(mystring);'。順便說一句,你有'text'和'mytext',並且你以混合的方式使用它們。當然,它應該只是一個。 – patatahooligan

+0

你好,謝謝,但我想避免使用模板類,因爲我仍然是新的C++ – DaLOLZ

+0

不幸的是,這是一個堆棧的標準實現。事實並非如此。聲明是您必須編寫的模板實例的唯一行。對於其他任何線路,它都會像其他任何類別一樣運行。如果你真的不想使用它,你可以藉此機會編寫你自己的'StringStack'類。 – patatahooligan

回答

0

通常情況下,一個堆棧將index = -1開始表明堆棧是空的。所以,你需要更換

int count = 0 

int count = -1 

後你做所有的推,你的籌碼看起來就像這樣:

hero[0] = "Goku" 
hero[1] = "Luffy" 
hero[2] = "Naruto" 

現在,打印出來以相反的順序,你可以從最後一個索引循環到第一個索引。在推出所有英雄串後,count現在等於2.最後的英雄將在index = 0。因此,您可以將環路重寫爲

while(count >= 0) 
{ 
    cout << hero[count] << " " <<endl; 
    Pop(); 
} 

您的Pop函數也是不正確的。在if聲明中,您將替換count的值爲0。您需要在Pop中執行的操作只是減少count的值。 所以,你可以通過改善你的函數

推送功能做工不錯改寫爲

void Pop() 
{ 
    count = count - 1; 
} 
0

好的,我們的餡餅,但只是改變它的順序是這樣的

void Push(string mytext) 
{ 
    hero[count] = mytext; //now you will start at index 0 
    count = count + 1; 
} 

流行的功能應該是這樣的

你需要返回一個字符串值,你不需要傳遞一個參數

string Pop() 
{ 
    if(count == 0) 
    { 
     return ""; 
    } 
    else 
    { 

     count = count - 1; 
     mytext = hero[count]; 
     return mytext; 
    } 

} 

你現在是函數準備讓我們使用他們

您正確使用推送功能,在主

我們需要改變其顯示輸出的同時

它應該是像這樣

while(true) 
     { 
      tempText = pop(); // this function will get you the last element and then remove it 
      if (tempText == "") // now we are on top of the stack 
       break; 

      cout <<tempText << " " <<endl; 

     } 
0

標準庫中定義的vector類就像一個sta CK。 例如:

// include the library headers 
#include <vector> 
#include <string> 
#include <iostream> 

// use the namespace to make the code less verbose 
using namespace std; 

int main() 
{ 
    // declare the stack 
    vector<string> heroStack; 

    // insert the elements 
    heroStack.push_back("Goku"); 
    heroStack.push_back("Luffy"); 
    heroStack.push_back("Naruto"); 

    // print elements in reverse order 
    while(!heroStack.empty()) 
    { 
     // get the top of the stack 
     string hero = heroStack.back(); 
     // remove the top of the stack 
     heroStack.pop_back(); 

     cout << hero << endl; 
    } 
} 
0
#include "stdafx.h" 
    #include <fstream> 
    #include <stack> 
    #include <string> 
    #include <iostream> 

    class ReadAndReversePrint 
    { 
     std::stack<std::string> st; 
     std::ifstream file; 
     public: 
     ReadAndReversePrint(std::string path) 
     { 
      file.open(path); 
      if (file.fail()) 
      { 
       std::cout << "File Open Failed" << std::endl; 
       return; 
     } 
     std::string line; 
     while (!file.eof()) 
     { 
      file >> line; 
      st.push(line); 
     } 
     file.close(); 

     std::cout << "Reverse printing : " << std::endl; 
     while (!st.empty()) 
     { 
      std::cout << st.top().c_str() << "\t"; 
      st.pop(); 
     } 
     std::cout << std::endl; 
    } 
}; 


int main() 
{ 
    ReadAndReversePrint rrp("C:\\awesomeWorks\\input\\reverseprint.txt"); 
    return 0; 
} 
相關問題