c ++中的堆栈类问题

时间:2014-05-13 04:10:15

标签: c++

在创建自己的堆栈类时,我无法让驱动程序工作,我猜它与我的堆栈类有关。它很直接,但我不确定如何在c ++中使用指针或任何东西。

司机:

    #include <iostream>
    #include "dynStack.h"
    using namespace std;
    int main()
    {
        dynStack stack;

        cout << "Stack has been created!";
        cout << endl;
        double a = 1.0;
        double b = 2.0;
        double c = 3.0;
        double d = 4.0;
        stack.print(cout);
        stack.push(a);
        stack.print(cout);
        stack.push(b);
        stack.print(cout);
        stack.push(c);
        stack.print(cout);
        stack.push(d);
        cout << "Stack : ";
        stack.print(cout);
        cout << "Peek : " << stack.peek() << endl;
        cout << stack.pop() << " " << stack.pop() << endl;
        cout << "Stack : ";
        stack.print(cout);

        return 0;
    }

dynStack:

    #include <iostream>
    #include <cstring>
    #include "dynStack.h"
    using namespace std;
    dynStack::dynStack()
    {
        stack[2];
        size = 2;
        top = 0;
    }
    void dynStack::push(double item)
    {
        if(full()) {
            grow();
        }
        stack[top] = item;
        top = top + 1;
    }
    double dynStack::pop()
    {
        if(half()) {
            shrink();
        }
        top  = top - 1;
        return stack[top];
    }
    double dynStack::peek()
    {
        return stack[top-1];
    }
    bool dynStack::full()
    {
        if(top == size-1){
            return true;
        }else{
            return false;
        }
    }
    bool dynStack::empty()
    {
        if(top == 0){
            return true;
        }else{
            return false;
        }
    }
    bool dynStack::half()
    {
        if((size-1)/2 >= top){
            return true;
        }else{
            return false;
        }
    }
    void dynStack::grow()
    {
        double newstack[size*2];
        for(int i = 0;i < top;i++){
            newstack[i] = stack[i];
        }
        memcpy(newstack,stack,sizeof(newstack));
        size = size * 2;
    }
    void dynStack::shrink()
    {
        double newstack[size*2];
        for(int i = 0;i < top;i++){
            newstack[i] = stack[i];
        }
        memcpy(newstack,stack,sizeof(newstack));
        size = size / 2;
    }
    void dynStack::print(ostream &outs)
    {
        outs << top << ", " << size << endl;
        for(int i = 0;i < top;i++){
            outs << stack[i] << " ";
        }
        outs << endl;
    }
    dynStack::~dynStack()
    {
        delete[] stack;
    }

以下是运行时的输出:

  

已经创建了堆栈!

     

0,2

     

1072693249,0

     

1 2.07445e-317 1 2 3 4 0 2.07342e-317 0 6.90266e-310 0 6.95328e-310   2.122e-314 2.07353e-317 0 -3.24318e-28 2.07342e-317 6.95328e-310 0 0 1.41629e + 28 1.2724e + 20 6.95314e-310 0 0 2.07441e-317 6.95328e-310 4.94066e-324 0 0 2.07342e-317 6.95328e-310 0 2.07344e-317 6.95328e-310 1.38338e-322 4.94066e-324 6.95328e-310 0 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e -310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 6.95328e-310 0 1.63042e-322 6.95328e-310 7.90505e-323 1.59085e-314 2.96439e-323 2.02369e-320 8.39912e-323 4.94066e-322 1.4822e-323 2.07229e-317 1.97626e-323 2.76677 e-322 2.47033e-323 3.95253e-323 3.45846e-323 6.90266e-310 3.95253e-323 0 4.44659e-323 2.07342e-317 5.43472e-323 2.23475e-318 5.92879e-323 2.23475e-318 6.42285e -323 7.47521e-321 6.91692e-323 7.47521e-321 1.13635e-322 0 1.23516e-322 6.95328e-310 1.5316e-322 6.95328e-310 7.41098e-323 6.95328e-310 0 0 0 -9.28906e + 105 -1.79234e + 115 1.12435e-307 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   1.97666e-81 9.67227e + 25 1.62348e + 219 3.86082e-81 1.41475e + 195 1.39012e + 93 1.10474e + 74 2.90131e-57 4.54684e + 174 6.75079e-67 1.39804e-76 3.69626e-33 4.66418e -86 5.41473e-67 4.01832e-57 1.26058e + 45 4.06567e-86 8.55074e-72 1.65546e-153 2.47713e + 93 3.86326e + 174 2.50522e-57 3.79156e + 180 1.27241e + 58 2.38705e + 93 4.83844e + 199 2.20538e + 213 2.80205e-28 7.76325e + 199 1.14493e + 247 2.67583e-28 2.00783e-52 6.60911e-62 5.79451e-13 9.18656e-72 6.60911e-62 1.2193e-12 2.14169e +190 9.88779e + 169 2.17145e-28 7.50417e-67 4.33383e-57 1.91907e-23 9.19158e-72 2.83717e + 161 2.17096e-28 9.1916e-72 9.1647e + 242 2.17096e-28 9.1916e-72 5.11531e + 281 2.17096e-28 2.53736e-76 4.31946e + 251 1.08845e-71 2.5458e-76 3.42223e + 280 1.08845e-71 1.42179e-23 2.53491e-76 3.73035e + 174 2.17096e-28 1.42179e -23 1.50195e-12 2.63685e-86 1.08845e-71 2.52152e-76 8.68541e + 164 2.17096e-28 9.1916e-72 1.85937e + 166 1.08845e-71 9.1916e-72 2.61683e + 180 2.17096e-28 9.19149e-72 1.84036e + 161 2.17096e-28 9.19153e-72 5.18703e + 170 2.17096e-28 9.1915e-72 2 .38222e + 233 1.08845e-71 9.1916e-72 6.60021e + 281 2.85505e-105 1.42179e-23 4.25708e + 180 2.67583e-28 9.19143e-72 8.02211e + 218 2.67583e-28 9.19149e-72 1.80229e +190 2.67583e-28 9.19149e-72 2.24784e + 190 2.67583e-28 9.19149e-72 6.00646e + 233 2.67583e-28 9.19143e-72 9.6544e + 199 2.00783e-52 2.53938e-76 6.59097e + 246 2.00783e-52 1.5009e-12 2.63685e-86 6.61004e-62 1.38632e-12 2.63685e-86 6.61004e-62 6.66181e-13 2.63685e-86 1.42179e-23 2.26652e + 261 2.85675e-105 1.42179e -23 1.03404e + 219 2.85675e-105 1.42179e-23 2.51252e + 261 2.85675e-105 9.19156e-72 8.40707e + 228 2.67583e-28 1.42179e-23 4.21761e + 262 2.85675e-105 1.42179e-23 3.29384e + 185 2.85675e-105 6.61004e-62 2.06642e + 166 2.85675e-105 1.42179e-23 1.07066e + 200 2.85675e-105 1.42179e-23 2.79455e + 262 2.85675e-105 6.61004e-62 2.54105e -76 7.96799e + 270 2.00783e-52 2.53838e-76 5.2219e + 275 2.00783e-52 2.5414e-76 2.44473e + 179 2.00783e-52 2.54445e-76 1.32529e + 160 2.00783e-52 2.54443e-76 3.57297e + 227 2.00783e-52 2.53801e-76 1.32529e + 160 2.80205e-28 2.53801e-76 8 .31897e + 217 1.31585e-47 7.21691e-13 2.63686e-86 6.60909e-62 6.90618e-14 2.63686e-86 6.60909e-62 6.65183e-13 2.63686e-86 1.31585e-47 2.54442e-76 1.32529e +160 1.31585e-47 2.53735e-76 6.59097e + 246 1.31585e-47 6.37762e-13 8.34445e + 62 9.31477e + 242 3.78452e + 180 2.34718e + 77 2.07591e + 243 9.04774e + 164 3.89028e-80 7.34039e + 223 5.34158e + 228 3.80984e + 180 1.09463e + 189 1.72016e + 21 2.19748e + 102 1.44264e + 214 1.25054e + 93 1.75138e + 190 1.41315e-307 4.97481e + 151 4.30153e-38 1.03863e +69 6.8分段故障

以下是输出的外观:

已经创建了堆栈!

0,2

1,2

1.0

2,2

1.0 2.0

3,4

1.0 2.0 3.0

Stack:1.0 2.0 3.0 4.0

Peek:4.0

4.0 3.0

堆叠:1.0 2.0

2 个答案:

答案 0 :(得分:2)

您需要使用new为堆栈分配内存。 e.g。

stack = new double[size];

同样,在您的增长和收缩例程中,您需要分配一个新的内存块,复制数据,删除旧的stack数据,然后将stack指向新内存。您当前的实现只将数据复制到本地数组然后返回,这将忘记复制的数据。

答案 1 :(得分:0)

指针并不像人们发出声音那样可怕。

首先要了解计算机内存是邮箱的一条长街,每个邮箱代表一个&#34;字节&#34;沿街的土地;这表示&#34;硬件表示&#34;。

显然,我们存储大于一个字节的内容,例如32位或64位数字。我们可以将其翻译成我们的街道类比,说#34;杂货店位于100-4 RAM Street&#34;。

计算机不是指定地址范围,而是通过在指令中包含大小来实现这一目的,以便将内容放入或取出内存,这通过打字系统冒泡到C / C ++中。 char占用一个字节,short占用两个字节(通常为16位),int通常为32位,等等。

现在,当你使用如下的简单代码时:

int i = 1;
int* p = new int;

ip通常都会加载到寄存器中。值1将被复制到第一个,但第二个是什么样的?嗯,它实际上只是一个数字 - 我们已分配用于存储另一个int值的邮箱的街道号。

它实际上是合法的(在32位系统上):

int i;
int* p = new int;
i = (int)p;

如果你打印我,你会得到一个号码。没有魔力。它只是一个地址。

你要去机场乘坐出租车到巴黎度过一个周末。司机问哪个门。你看看你的机票,它说&#34; 23号航站楼&#34;。你的票是一个指针。它说&#34; 23&#34;,但你手中的东西纯粹是你登机的地址,它实际上并不是终端本身。

你到机场,办理登机手续 - 1110航班 - 到休息室睡着了。你醒了6个小时后发现:你的飞机已经走了。

您的机票仍然显示&#34; 23号航站楼&#34; - 但是如果你去23号航站楼,你的航班会在那里吗?不,票证只是一个指针。 23号航站楼仍然在那里 - 你可以去,如果机场工作人员睡着了你可以登机,但它会带你去巴黎吗?只有巴黎在阿塞拜疆。这就是所谓的陈旧&#34;陈旧&#34;指针。

int* i = new int;
*i = 42; // load '42' in to the address described by i
delete i;
std::cout << *i << '\n'; // ERROR

当我们写delete ifree(i)时,我们告诉操作系统我们已经腾出指针所指向的内存。我们仍然拥有地址,所以我们仍然可以尝试访问该位置,但这就像在酒店的抽屉里放一张20美元的钞票,退房,并在一个月后回来查看是否它还在那里......房间是,抽屉是,但是是否有纸币?

指针的关键,给char* p

p是地址,它是一个数值,你可以做一些不幸的事情,比如p = 0,这使p成为地址0的指针。 。 *p是地址char的值,在本例中为p。在我们的机场示例中,p为23,p的内容为1110(您的航班号)。 。 &p是p的地址。如果p存储在内存中,那么它也有一个地址。 。 char**双星表示指针的地址&#39;或指向指针的指针,你可以将&p传递给一个带char**的函数, 。 void*有时候你并不关心指针指向的是什么,你只需要地址 - 例如对于像free这样的函数。在这种情况下,所有指针都能够隐式转换为void*

HTH