簡體   English   中英

基於C ++數組的堆棧

[英]C++ Array Based Stack

一旦變滿,我想將堆棧翻倍。 我試過調用拷貝構造函數,而當我調用它時,堆棧並不會一直壓入單詞。 代碼在變滿之前可以完美運行,但是一旦變滿就是發生問題的地方。 我究竟做錯了什么?

    #include<iostream>
    #include<fstream>
    #include<string>
    //#include "ArgumentManager.h"
    #include "Stack.h"


    using namespace std;



    int main(int argc, char** argv){

        //ArgumentManager am(argc, argv); //Instantiating parser for command line arguments

        //ReAdInG tHe InPuT fIlE nAmE
        //ifstream infile(am.get("A").c_str()); // file to read from, getting name from command line
        //ofstream outfile(am.get("C").c_str()); // output file, getting name from command line
        ifstream infile;
        ofstream outfile;
        arrayStack<string> firstStack(10);
        arrayStack<string> secondStack(firstStack);
        firstStack.stackInitialize();
        infile.open("input.txt");
        outfile.open("output.txt");

        //iF tHe FiLe IsNt ReAd
        if(!infile){
            std::cout << "ErRor[Input file not Found] YoU hAd OnE jOb....ShAmE" << endl;
            std::cout << "ExItInG PrOgRaM!!! GoOdByE" << endl;
            return 0;


        };

        string tester; // to get the words 

        //READ FROM INFILE AND OUTPUT TO OUTFILE
        while(infile >> tester){

            for(int i = 0; i < tester.size(); ++i)
            { // CHECK IF A SPECIAL CHARACTER IS ON THE FILE 
                if(!((tester[i] >= 'a' && tester[i] <= 'z')||(tester[i] >= 'A' && tester[i]<= 'Z')))
                    {
                    tester[i] = '\0';
                    }
            }
            firstStack.push(tester);
        };

            while(!firstStack.stackIsEmpty())
            { 
                string b = firstStack.top();
                outfile << b << " ";
                cout << b << " ";
                if(firstStack.stackIsFull()){
                secondStack.push(tester)
                };
                firstStack.pop();


            }



        infile.close();
        outfile.close();

        return 0;
    }

我也嘗試在push函數中調用復制構造函數,例如:

        template <class Type>
    void arrayStack<Type>::push(const Type& word){
        if(topStack != maxStackSize){
            list[topStack] = word; // adding a new word to the STACK
            topStack++;
        }
        else
            cout << "YOU KNOW YOU CAN'T ADD TO A FULL STACK............SHAME" << endl;
            arrayStack<Type> newArrayStack(maxStackSize*2);

            for(int i = 0; i < maxStackSize; i++){
                newArrayStack.push(list[i]);
            }
            newArrayStack.push(word);
            stackCopy(newArrayStack);
    }

它也不起作用。

以下是堆棧模板

 //ARRAY BASED STACK TEMPLATE #ifndef H_ArrayStack #define H_ArrayStack #include <iostream> using namespace std; template <class Type> class arrayStack{ private: int maxStackSize; // the maximum height of the STACK int topStack; // the top of the STACK void stackCopy(const arrayStack<Type>& newArrayStack); Type *list; // array based needs pointer to hold the stack element public: const arrayStack<Type>& operator=(const arrayStack<Type>&); void stackInitialize(){ topStack = 0;}; //Ensure the array stack is empty bool stackIsEmpty() const{return(topStack == 0);}; //check if stack is empty, is const so will not be messed with bool stackIsFull() const{return topStack == maxStackSize;}; // just like line 8 except check if it is full void push(const Type& word); // add a word to the array STACK void pop(); //remove a word from the array and increment the top Type top() const; //returns the top of the STACK arrayStack(int size); //the default constructor arrayStack(const arrayStack<Type>& newArrayStack); // the copy constructor which allows a new STACK ~arrayStack(){delete [] list;}; // it is an array so to ensure no memory leaks the stack must be deleted after use }; template <class Type> void arrayStack<Type>::push(const Type& word){ if(topStack != maxStackSize){ list[topStack] = word; // adding a new word to the STACK topStack++; } else{ cout << "YOU KNOW YOU CAN'T ADD TO A FULL STACK............SHAME" << endl; int size = maxStackSize; maxStackSize *= 2; Type *temp = new Type[maxStackSize]; // create temp and double the size of list for(int i = 0; i < size; i++){ // copy over all the values temp[i] = list[i]; } delete [] list; // delete the list list = temp; // point to the resized list list[topStack] = word; topStack++; } } template <class Type> void arrayStack<Type>::pop(){ if (!stackIsEmpty()){ topStack--; } } template <class Type> Type arrayStack<Type>::top() const{ if(topStack == 0){ return 0; } else return list[topStack - 1]; } template <class Type> arrayStack<Type>::arrayStack(int size){ maxStackSize = size; topStack = 0; list = new Type[maxStackSize]; } template <class Type> void arrayStack<Type>::stackCopy(const arrayStack<Type>& newArrayStack){ maxStackSize = newArrayStack.maxStackSize; topStack = newArrayStack.topStack; list = new Type[maxStackSize]; for(int j = 0; j < topStack; j++) list[j] = newArrayStack.list[j]; } template <class Type> arrayStack<Type>::arrayStack(const arrayStack<Type>& newArrayStack){ stackCopy(newArrayStack); } template <class Type> const arrayStack<Type>& arrayStack<Type>::operator=(const arrayStack<Type>& newArrayStack){ if(this != &newArrayStack) stackCopy(newArrayStack); return *this; } #endif 

從:

arrayStack<Type> newArrayStack(maxStackSize*2);
for(int i = 0; i < maxStackSize; i++){
      newArrayStack.push(list[i]);
}
newArrayStack.push(word);
stackCopy(newArrayStack);

至:

int size = maxStackSize; 
maxStackSize *= 2;  
Type *temp = new Type[maxStackSize]; // create temp and double the size of list
for(int i = 0; i < size; i++){ // copy over all the values
    temp[i] = list[i];
} 
delete [] list;       // delete the list 
list = temp;          // point to the resized list
list[topStack] = word;
topStackk++;

在推送功能中嘗試此操作,這將使堆棧的大小增加一倍。 就像評論中提到的人一樣,您的復制構造函數和stackcopy函數中也有錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM