在创建自己的堆栈类时,我无法让驱动程序工作,我猜它与我的堆栈类有关。它很直接,但我不确定如何在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
答案 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;
i
和p
通常都会加载到寄存器中。值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 i
或free(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