关于C++编程栈的问题,程序如下

头文件(SqStack1.h):#ifndef_SQSTACK1_#define_SQSTACK1_#include<iostream>usingnamespacestd... 头文件(SqStack1.h):
#ifndef _SQSTACK1_
#define _SQSTACK1_
#include <iostream>
using namespace std;
template<class ElemType>
class SqStack1
{
public:
SqStack1(int);
~SqStack1();
int Length() const;
void Push(const ElemType &e);
void CreateS();
void ShowS() const;
private:
ElemType *m_base;
int m_top;
int m_size;
};

#endif

template<class ElemType> //栈的初始化
SqStack1<ElemType>::SqStack1(int m = 0)
{
m_top = 0;
m_base = new ElemType[m];
m_size = m;
}

template<class ElemType> // 析构函数
SqStack1<ElemType>::~SqStack1()
{
if(m_base!=NULL) delete[] m_base;
}

template<class ElemType> //栈的展示
void SqStack1<ElemType>:: ShowS() const
{
for(int i = 0;i < m_top; i++)
{
cout << m_base[i] << " ";
}
}

template<class ElemType>// 求栈的长度
int SqStack1<ElemType>::Length() const
{
return m_top;
}

template<class ElemType> //手动添加栈的值
void SqStack1<ElemType> :: CreateS()
{
for(int i = 0;i < m_size; i++)
{
cin >> m_base[i];
m_top++;
}
}

template<class ElemType> //入栈
void SqStack1<ElemType>::Push(const ElemType &e)
{
if(m_top>=m_size)
{
ElemType *newbase;
newbase = new ElemType[m_size + 10];
for(int j = 0;j < m_top; j++)
newbase[j] = m_base;
delete[] m_base;
m_base = newbase;
m_size += 10;
}
m_base[m_top++] = e;
}
展开
 我来答
jkla139
2013-11-23 · TA获得超过619个赞
知道小有建树答主
回答量:347
采纳率:100%
帮助的人:250万
展开全部

#ifndef _SQSTACK1_
#define _SQSTACK1_
#include <iostream>
using namespace std;

template<class ElemType>
class SqStack1
{
public:
SqStack1(int);
~SqStack1();
int Length() const;
void Push(const ElemType &e);
void CreateS();
void ShowS() const;
private:
ElemType *m_base;
int m_top;
int m_size;
};
#endif


template<class ElemType> //栈的初始化 
SqStack1<ElemType>::SqStack1(int m = 0)
// m=0,假如没有大于0的参数,得到一个没长度却有地址的数组,你看多危险啊
{
m_top = 0;
//你想把第一个元素浪费掉以便操作吗? 如果是,和下面的CreatS的循环变量不统一
m_base = new ElemType[m];
m_size = m;
}


template<class ElemType> // 析构函数 
SqStack1<ElemType>::~SqStack1()
{
if(m_base!=NULL)
delete[] m_base;
}


template<class ElemType> //栈的展示 
void SqStack1<ElemType>:: ShowS() const
{
for(int i = 0;i < m_top; i++)
{
cout << m_base[i] << " ";
}
cout<<endl;
}


template<class ElemType>// 求栈的长度 
int SqStack1<ElemType>::Length() const 
{
return m_top;
}

template<class ElemType> //手动添加栈的值 
void SqStack1<ElemType> :: CreateS() // 是对原来的栈元素进行覆盖还是添加?
{
for(int i = 0;i < m_size; i++)
// 和top不统一,top从0起,i从0开始,容易出现乱码
{
cin >> m_base[i];
m_top++; 
}
}


template<class ElemType> //入栈
void SqStack1<ElemType>::Push(const ElemType &e)
{
if(m_top>=m_size)
{
ElemType *newbase;
newbase = new ElemType[m_size + 10];
for(int j = 0;j < m_top; j++)
newbase[j] = m_base[j];
// cannot convert from 'int *' to 'int',m_base后加上[j]
delete[] m_base;
m_base = newbase;
m_size += 10;  
}
m_base[m_top++] = e;
}
更多追问追答
追问
刚手动创建完栈立即输出栈的话,栈里的元素是完好的,但一旦在其他分支中调用已创建对象的ShowS( )函数,栈的前两个元素就变成了乱码。不知道是哪里错了。原因是你说得那句“和top不统一,top从0起,i从0开始,容易出现乱码"吗···
追答
不好意思,打错,是“m_top从1开始,i从0开始”,m_top[0]是空的

你想一下,假设m_size=n,如果top从1开始,到n-1,那么m_base[1]到m_base[n-1]
而ShowS的循环变量是从0开始的,那么m_base[0]到m_base[n-1],会怎样?
心中风情4
2013-11-23 · TA获得超过2247个赞
知道大有可为答主
回答量:1779
采纳率:66%
帮助的人:1066万
展开全部
什么问题啊?

模板类一般要求所有实现代码都定义在同一个文件中,要使用模板的分离编译模式要使用export关键字, 但现在主流编译器都不支持。
更多追问追答
追问
刚手动创建完栈立即输出栈的话,栈里的元素是完好的,但一旦在其他分支中调用已创建对象的ShowS( )函数,栈的前两个元素就变成了乱码。不知道是哪里错了。原因是你说得那句“和top不统一,top从0起,i从0开始,容易出现乱码"吗···
追答

你的代码唯一的错误是:

newbase[j] = m_base;//你这是把m_base的地址赋值给newbase[j],所以倒是有可能输出乱码,改为m_base[j],应该就ok了

template<class ElemType> //入栈
void SqStack1<ElemType>::Push(const ElemType &e)
{
if(m_top>=m_size)
{
ElemType *newbase;
newbase = new ElemType[m_size + 10];
for(int j = 0;j < m_top; j++)
    newbase[j] = m_base[j];//这里
delete[] m_base;
m_base = newbase;
m_size += 10;  
}
m_base[m_top++] = e;
}


这个

但一旦在其他分支中调用已创建对象的ShowS( )函数,栈的前两个元素就变成了乱码。


是啥意思?能否给出相关代码?

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
汉字的学问乐园
2013-11-23 · TA获得超过1849个赞
知道小有建树答主
回答量:2374
采纳率:66%
帮助的人:2042万
展开全部
落尺碧桃春似水。。
追问
逗我?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式