栈的不明白

饭fan有引力 2010-10-12 07:50:22
最近做数据结构的时候,不习惯里面的语法,感觉C++学得。。现在下面的问题大家帮忙看下,指出哪里不对了,要注意什么问题。谢谢

//源文件
#include "Stack.h"
#include <iostream>
using namespace std;

int Trans(int n, int b)
{
Stack<int> stack;
int i, result=0;
while(n != 0)
{
i = n % b;
n = n / b;
stack.Push(i);
}
while(!stack.IsEmpty())
{
i = stack.getTop(result);
stack.Pop(result);
result = result * 10 + i;
}
return result;
}

void main()
{
int N, B;
cout << "Input the system before change : ";
cin >> N;
cout << "Input the system after change : ";
cin >> B;
cout << Trans(N, B) << endl;
system("pause");
}



//头文件
#ifndef STACK_H
#define STACK_H

const int maxSize = 50;

template <class T>
class Stack //栈的类定义
{
private:
T *elements; //存放栈中元素的栈数组
int top; //栈顶指针
int maxSize; //栈最大可容纳元素个数
void overflowProcess(); //栈的溢出处理
public:
Stack(int sz=50); //构造函数
~Stack(); //析构函数
void MakeEmpty(); //清空栈的内容
void Push(const T& x); //新元素x进栈
bool Pop(T &x); //栈顶元素出栈,由x返回
bool getTop(T &x) //读取栈顶元素,由x返回
{
if(IsEmpty() == true)
return false;
x = elements[top]; //返回栈顶元素的值
return true;
}
bool IsEmpty(){return (top=-1)? true:false;}
//判断栈空否
bool IsFull()const{return (top=maxSize-1)? true:false;}
//判断栈满否
int getSize()const{top=-1} //计算栈中元素个数
};

template <class T>Stack<T>::Stack(int sz):top(-1), maxSize(sz)
{
//建立一个最大尺寸为sz的空栈,若分配不成功则错误处理。
elements = new T[maxSize]; //创建栈的数组空间
assert(elements != NULL); //断言:动态存储分配成功与否
};

template <class T>void Stack<T>::overflowProcess()
{
//私有函数:扩充栈的存储空间。
T *newArray = new T[maxSize+stackIncreament];
if(newArray = NULL)
{
cerr << "存储分配失败!" << endl;
exit(1);
}
for(int i=0; i<=top; i++)
newArray[i] = elements[i];
maxSize = maxSize + stackIncreament;
delete []elements;
elements = newArray;
};

template <class T>void Stack<T>::Push(const T& x)
{
//公共函数:若栈不满,则将元素x插入到该栈的栈顶,否则溢出处理。
if(IsFull() == true)
overflowProcess(); //栈满则溢出处理
elements[++top] = x; //栈顶指针先加1,再进栈
};

template <class T>bool Stack<T>::Pop(T &x)
{
//公共函数:若栈不空则函数返回该栈栈顶元素的值,然后栈顶指针退1
if(IsEmpty() == true) //判栈空否,若栈空则函数返回
return false;
x = elements[top--]; //栈顶指针退1
return true; //退栈成功
};

#endif
...全文
207 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
beatles_wang 2010-10-12
  • 打赏
  • 举报
回复
进来看看,细节
Rainqin123 2010-10-12
  • 打赏
  • 举报
回复

template <class T>Stack<T>::Stack(int sz):top(-1), maxSize(sz)
{
//建立一个最大尺寸为sz的空栈,若分配不成功则错误处理。
elements = new T[maxSize]; //创建栈的数组空间
assert(elements != NULL); //断言:动态存储分配成功与否

//此处内存分派失败啦?};



template <class T>void Stack<T>::overflowProcess()
{
//私有函数:扩充栈的存储空间。
T *newArray = new T[maxSize+stackIncreament];
if(newArray = NULL)//这里有严重问题.....此处最好用assert或者最好异常处理工作,,,, {
cerr << "存储分配失败!" << endl;
exit(1);
}
for(int i=0; i<=top; i++)
newArray[i] = elements[i];
maxSize = maxSize + stackIncreament;
delete []elements;
elements = newArray;
};




bool IsEmpty(){return (top=-1)? true:false;}
//判断栈空否
bool IsFull()const{return (top=maxSize-1)? true:false;}
//判断栈满否
int getSize()const{top=-1}
///这里都错了.....
其他的,但从数据结构上看,也看不出什么问题,只能说楼主代码写的挺棒,风格挺不错,...需要优化

zhanshen2891 2010-10-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fengxuxing 的回复:]
注意这行 if(newArray = NULL)
[/Quote]

这问题挺大啊
fox_ocean 2010-10-12
  • 打赏
  • 举报
回复


T *newArray = new T[maxSize+stackIncreament];
if(newArray = NULL) //if(newArray == NULL) 少了一个=
{
cerr << "存储分配失败!" << endl;
exit(1);
}
有人说这是C的语法格式,对于C++来说这样会好一点
try
{
T *newArray = new T[maxSize+stackIncreament];
}
catch(...)//不记得这个参数该添什么了。
{
cerr << "存储分配失败!" << endl;
exit(1);
}

if(IsEmpty() == true)//个人来说不喜欢这种语法格式,为什么不直接
if(IsEmpty())

template <class T>void Stack<T>::overflowProcess()
{
//私有函数:扩充栈的存储空间。
T *newArray = new T[maxSize+stackIncreament];
if(newArray = NULL)
{
cerr << "存储分配失败!" << endl;
exit(1);
}
for(int i=0; i<=top; i++)
newArray[i] = elements[i]; //这里为什么不直接memcpy呢
maxSize = maxSize + stackIncreament;
delete []elements;
elements = newArray;
};

template <class T>void Stack<T>::Push(const T& x)
{
//公共函数:若栈不满,则将元素x插入到该栈的栈顶,否则溢出处理。
if(IsFull() == true)
overflowProcess(); //栈满则溢出处理
elements[++top] = x; //栈顶指针先加1,再进栈
//好像对于进站来说,是先进站,再加一。当然这也是个人习惯,
//因为我学数据结构时是这样说的。
elements[top++] = x; //初始化时top=0;
};


Qlaiaqu 2010-10-12
  • 打赏
  • 举报
回复
注意这行 if(newArray = NULL)
Qlaiaqu 2010-10-12
  • 打赏
  • 举报
回复
template <class T>void Stack<T>::overflowProcess()
{
//私有函数:扩充栈的存储空间。
T *newArray = new T[maxSize+stackIncreament];
if(newArray = NULL)
{
cerr << "存储分配失败!" << endl;
exit(1);
}
for(int i=0; i<=top; i++)
newArray[i] = elements[i];
maxSize = maxSize + stackIncreament;
delete []elements;
elements = newArray;
};



稍微看了一下,代码比较啰嗦,那些true和false的地方没必要专门使用==号在对比一下,可以直接判断,前面的?:结构也可以省略掉
Rainqin123 2010-10-12
  • 打赏
  • 举报
回复
牛...到公司了我好好看看这个代码,现在要去上班了,没时间看了...

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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