关于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;
} 展开
#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;
} 展开
3个回答
展开全部
;
#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],会怎样?
展开全部
什么问题啊?
模板类一般要求所有实现代码都定义在同一个文件中,要使用模板的分离编译模式要使用export关键字, 但现在主流编译器都不支持。
模板类一般要求所有实现代码都定义在同一个文件中,要使用模板的分离编译模式要使用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( )函数,栈的前两个元素就变成了乱码。
是啥意思?能否给出相关代码?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
落尺碧桃春似水。。
追问
逗我?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询