0

所以我正在尝试了解模板以及 Fifo 和 Lifo 堆栈的东西。我一直在玩一些处理这个问题的代码,我可以得到 int 数据来做我想做的测试,但我一生都无法弄清楚如何让它与字符串一起工作。我拥有代码的方式不断在我身上崩溃,但没有给我任何错误,所以我想我会在这里弹出,看看是否有人能告诉我我做错了什么。这是我的代码:

-----------//my header//---------------------

#include <stdlib.h>
#include <iostream>
#include <string>

#ifndef STACK_H_
#define STACK_H_

template<class T> 
class StackTest
{

private:
unsigned int maxSize;
T *stackData;
int top;

public:
StackTest(int size){
    stackData = new T[size];//to hold the T ‌type data items 
    top = -1;//no items on the stack
    maxSize = size;//set maximum size that stack can hold
}

virtual ~StackTest(){}

int count(){
    return top + 1;
}

bool isEmpty(){
    return top == -1 ? true : false;
}

bool isFull(){
    return top == maxSize - 1 ? true : false;
}

T* peek(){
    if(!isEmpty())//check for empty
        return &stackData[top - 1];
}

T* pop(){
    if(!isEmpty()){
        top -= 1;//decrease the top by 1 to indicate the delete
        return &stackData[top];//return deleted item
    }
    return NULL;
}

void push(T* item){
    stackData[top++] = *item;//insert to data array and increase the top by one 
}
};


#endif /* STACK_H_ */

-----------//my main//---------------

#include <iostream>
#include <string>
#include "Pair.h"

using namespace std;

int main() {

int dataTest;
string strTest;
StackTest<int> intStack(10);
StackTest<string> stringStack(50);

//Insert data into the stack
dataTest = 3;
intStack.push(&dataTest);
dataTest = 4;
intStack.push(&dataTest);
dataTest = 5;
intStack.push(&dataTest);
dataTest = 6;
intStack.push(&dataTest);
strTest = "test";
stringStack.push(&strTest);

//Show the top item
cout << *intStack.peek() << endl;
cout << *stringStack.peek() << endl;

//Pull the top item out (twice)
intStack.pop();
intStack.pop();

//Show the new top item
cout << *intStack.peek() << endl;

return 0;
}

因此,如果有人想给我一些指示,我将不胜感激,谢谢。

4

1 回答 1

0

您的实施存在一些问题。最微妙的之一是在push()成员函数中:

void push(T* item){
    stackData[top++] = *item; //insert to data array and increase the top by one
    //           ^^
    //           You want pre-increment here!
}

这是递增top并使用值作为stackData. 由于堆栈top-1空时,您的程序实际上正在执行以下操作:

stackData[-1] = *item;
top = 0;

不用说,第一次赋值会导致未定义的行为。

未定义行为的另一个来源是peek()成员函数,它在堆栈为空时不返回任何内容:

T* peek(){
    if(!isEmpty())//check for empty
        return &stackData[top - 1];
}

根据 C++11 标准的第 6.6.3/2 段:

[...] 从函数末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为。

但这不是唯一的问题:另一个问题是访问stackData

return &stackData[top - 1];

top不等于或大于一时,这也将导致未定义的行为,因为您将获取位于数组中负地址的(非)对象的地址。

isEmpty()另外,我建议重写isFull()如下:

bool isEmpty(){
    return (top == -1);
}

bool isFull(){
   return (top == maxSize - 1);
}

作为一般建议,请考虑不要在堆栈为空时使用该-1top正如 Ben Voigt 在评论中提到的那样,这会导致你犯很多错误。

此外,正如 DyP 所指出的,您的析构函数没有释放构造函数中分配的内存,因此您的StackTest对象正在泄漏内存。在这样做之后,既然我们在做,你可能想看看所谓的三法则,你的程序会违反。

于 2013-05-13T23:28:10.520 回答