关于c++Primer书上4.15栈类实例的问题

hahaer425 2009-03-04 09:38:03
前几天看到c++Primer(第三版)4.15栈类实例,按照源码输入c++.net2003,发现其中问题,怎么也得不到书上写的输出结果,请大家指点一下(有书的朋友验证一下),看看是怎么回事,不知道是我错了?还是书的问题……..,由于新手还望大家不吝指教,谢谢!!!!!。

iStack头文件:
#include <vector>
using std::vector;
using std::cout;
using std::endl;

class iStack
{
public:
iStack(int capacity):_stack(capacity),_top(0) {}
bool pop(int &value);
bool push(int value);

inline bool full()
{return _top?false:true;} //这一句,由于_top被初始为0了,full()不就永远返回true了吗?
inline bool empty()
{return _top<size()-1?false:true;}//_top是不是应该永远比_top-1大?
void display();

inline int iStack::size(){return _top;};
private:
int _top;
vector<int> _stack;
};

bool iStack::pop(int &top_value)
{
if(empty())//是不是empty()应该返回真,if返回false,下面的语句执行不到?
return false;

top_value=_stack[--_top];
cout<<"iStack::pop():"<<top_value<<endl;

return true;
}

bool iStack::push(int value)
{
cout<<"iStack::push("<<value<<")\n";

if(full())
return false;

_stack[_top++]=value;//由于_top被初始为0,上面的if永远为真,直接return了,下面这些语句就执行不了了
return true;
}

void iStack::display()
{
if(!size())
{
cout<<"(0)\n";
return ;
}
cout<<"("<<size()<<")(bot:";
for(int ix=0;ix<_top;++ix)
cout<<_stack[ix]<<" ";
cout<<":top)\n";
}


// 栈类实例.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "iStack.h"
using std::cout;
using std::endl;

int main()
{
iStack stack(32);

stack.display();
for(int ix=1;ix<51;++ix)
{
if(ix%2==0)
stack.push(ix);

if(ix%5==0)
stack.display();

if(ix%10==0)
{
int dummy;
stack.pop(dummy);stack.pop(dummy);
stack.display();
}
}
return 0;
}
...全文
112 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
insulted 2009-05-04
  • 打赏
  • 举报
回复
抱歉回晚!
1):不是你理解的那样!
pop函数实现了数据元素的弹出操作!
_stack[ --_top ];这句就是!注意前缀--操作!
你的意思我明白:就是说其实pop后的数据元素还在_stack数组中,对,没错!但是这就和计算机的内存使用方式一样:是覆盖写的方式,即,下次再次使用这个空间的时候才覆盖写入新的数据。
这是我的pop函数的实现,和你的一样了,呵呵!

bool iStack::pop( int& top_value ) {
if ( empty() )
return false;

top_value = _stack[ --_top ];
cout<< " iStack::pop(): " << top_value << endl;

return true;
}


2):佩服你的细心!没错!我的输出和你一样!
hahaer425 2009-03-06
  • 打赏
  • 举报
回复
谢谢大家,尤其要谢谢insulted,我看你回言后又认真看了一遍,果然发现有问题,虽然是自己亲自敲入的码....,问题已经解决,是我自己太粗心,搞错了三处地方,
1、inline bool empty() //和 full()反了
{return _top?false:true;}
2、inline bool full() //和empty()反了
{return _top<_stack.size()-1?false:true;}
3、应该是_top<_stack.size()-1,而不是_top<size()-1 //是vector的函数,非iStack的函数

当时自己敲入后没仔细看就......汗颜、惭愧......

我在认真看过后,虽然以上问题解决,但又有两个小问题,你有时间可以看一下:
1、实质上pop函数并没有实现真正意义上的弹出数据,而是不显示弹出的数据而已,不知是不是这样?
void iStack::display()/*输出打印函数,可在此测试pop弹出函数并非是把数据真正弹出,而是不显示栈内弹出的数据而已,而后续压入的数据又把栈内不显示的数据覆盖,而最后要弹出的数据由于没有后续数据的覆盖,就一直存在vector容器中。*/
2、我输出的格式第一行是(0),而不是书上的(0)(bot::top),你的呢?仅第一行,其余的都一样,这是怎么回事?

谢谢你其他提醒,我的QQ:48327964,交个朋友,有什么问题也好向你学习!!!
insulted 2009-03-04
  • 打赏
  • 举报
回复
lz,我看到也是三版的《Primer》啊,怎么你的code和我的不一样?
lz,书上的code建议你最好自己敲进去,即使CD里有现成的或是网上有打包下载的(没有自己敲吧,呵呵,这个例子我照着书上的code敲过,没有问题,放心,如果你真的...可以给我发csdn私信,我传给你)。
Sco_field 2009-03-04
  • 打赏
  • 举报
回复

inline bool full()
{return _top?false:true;} //这一句,由于_top被初始为0了,full()不就永远返回true了吗?

这句好像是有问题,反了
sagegz 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 maenxiang 的回复:]
C++ Primer不觉得怎么样,入门看看就是。别当真。

你的这个问题我没看过。不过是错的很离谱的那种。
[/Quote]
不愧是人如其名哈!
Sco_field 2009-03-04
  • 打赏
  • 举报
回复
没仔细看,
不过程序里有 --_top,_top++.
因此,_top显然不可能是一个定值0
maenxiang 2009-03-04
  • 打赏
  • 举报
回复
C++ Primer不觉得怎么样,入门看看就是。别当真。

你的这个问题我没看过。不过是错的很离谱的那种。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧