数据结构 动态可调数组 顺序栈
来源:互联网 发布:柠檬免费网络电视 编辑:程序博客网 时间:2024/04/30 09:01
#include <assert.h>
#include <iostream>
using namespace std;
const int INC_SIZE = 20; //自动扩容增量
template <class T> class SeqStack {
private:
T *elements; // 栈元素数组
int top; // 栈顶指针
int maxSize; // 栈最大容量
void _OverflowProcess(); // 自动溢出处理
public:
SeqStack ( int sz = 50 ); //构造函数
SeqStack (SeqStack<T>& s); //复制构造函数
~SeqStack ( ) { delete [ ] elements; }
void Push (const T & item); //进栈
T Pop(); // 出栈,更合理的接口设计
T& Top(){return elements[top];}; //取栈顶元素,与C++标准库一致
int GetSize() {return top + 1; } //取元素数量
bool IsEmpty ( ) const { return top == -1; }
bool IsFull( ) const {return top==maxSize?false:true;}
void MakeEmpty ( ) { top = -1; } //清空栈
SeqStack<T>& operator=(SeqStack<T>& s);
int GetMaxSize() const {return maxSize;}
T Locate(int i) const {return elements[i];}
};
template <class T>
SeqStack<T> ::SeqStack ( int sz ) : top (-1), maxSize (sz) {//默认初始化
elements = new T[maxSize];
//C++断言,若内存分配失败则终止运行:
assert ( elements != NULL );
}
template <class T>
SeqStack<T> ::SeqStack (SeqStack<T>& s){
top=s.GetSize()-1;
maxSize=s.GetMaxSize();
elements=new T[maxSize];
assert (elements != NULL);
for(int i=0;i<=top;i++)
{
elements[i]=s.Locate(i);
}
}
template <class T>
void SeqStack<T> ::Push (const T & item){
if(IsFull()) _OverflowProcess();
elements[top+1]=item;
top=top+1;
}
template <class T>
T SeqStack<T> ::Pop(){
T ret;
if (top >= 0) ret = elements[top--]; //退出栈顶元素
return ret;
return ret;
}
template <class T>
SeqStack<T>& SeqStack<T> ::operator=(SeqStack<T>& s){
maxSize=s.maxSize;
elements=new T[maxSize];
top=s.GetSize()-1;
for(int i=0;i<top;i++)
{
elements[i]=s.Locate(i);
}
delete[] elements;
}
template <class T> void SeqStack<T> ::
_OverflowProcess () {
// 私有成员函数:栈满时扩容
T* newArray=new T[maxSize + INC_SIZE];
assert(newArray!=NULL); //断言内存分配成功
for(int i=0; i<=top; i++)
newArray[i]=elements[i]; // 复制原有数据
maxSize += INC_SIZE;
delete[] elements; // 释放原数组
elements = newArray; // 指向新数组
}
int main()
{
SeqStack <int>mystack;
for(int i=0;i<10;i++)
mystack.Push(i);
for(int i=9;i>=0;i--)
cout<<mystack.Locate(i)<<" ";
cout<<endl;
SeqStack <int>mystack2=mystack;
for(int i=0;i<10;i++)//测试
cout<<mystack2.Pop()<<" ";
cout<<endl;
SeqStack <int>mystack3;
for(int i=0;i<10;i++)
mystack3.Push(i);
for(int i=9;i>=0;i--)
cout<<mystack.Locate(i)<<" ";
cout<<endl;
mystack3=mystack;
for(int i=0;i<10;i++)
mystack3.Push(i);
for(int i=9;i>=0;i--)
cout<<mystack.Locate(i)<<" ";
cout<<endl;
return 0;
#include <iostream>
using namespace std;
const int INC_SIZE = 20; //自动扩容增量
template <class T> class SeqStack {
private:
T *elements; // 栈元素数组
int top; // 栈顶指针
int maxSize; // 栈最大容量
void _OverflowProcess(); // 自动溢出处理
public:
SeqStack ( int sz = 50 ); //构造函数
SeqStack (SeqStack<T>& s); //复制构造函数
~SeqStack ( ) { delete [ ] elements; }
void Push (const T & item); //进栈
T Pop(); // 出栈,更合理的接口设计
T& Top(){return elements[top];}; //取栈顶元素,与C++标准库一致
int GetSize() {return top + 1; } //取元素数量
bool IsEmpty ( ) const { return top == -1; }
bool IsFull( ) const {return top==maxSize?false:true;}
void MakeEmpty ( ) { top = -1; } //清空栈
SeqStack<T>& operator=(SeqStack<T>& s);
int GetMaxSize() const {return maxSize;}
T Locate(int i) const {return elements[i];}
};
template <class T>
SeqStack<T> ::SeqStack ( int sz ) : top (-1), maxSize (sz) {//默认初始化
elements = new T[maxSize];
//C++断言,若内存分配失败则终止运行:
assert ( elements != NULL );
}
template <class T>
SeqStack<T> ::SeqStack (SeqStack<T>& s){
top=s.GetSize()-1;
maxSize=s.GetMaxSize();
elements=new T[maxSize];
assert (elements != NULL);
for(int i=0;i<=top;i++)
{
elements[i]=s.Locate(i);
}
}
template <class T>
void SeqStack<T> ::Push (const T & item){
if(IsFull()) _OverflowProcess();
elements[top+1]=item;
top=top+1;
}
template <class T>
T SeqStack<T> ::Pop(){
T ret;
if (top >= 0) ret = elements[top--]; //退出栈顶元素
return ret;
return ret;
}
template <class T>
SeqStack<T>& SeqStack<T> ::operator=(SeqStack<T>& s){
maxSize=s.maxSize;
elements=new T[maxSize];
top=s.GetSize()-1;
for(int i=0;i<top;i++)
{
elements[i]=s.Locate(i);
}
delete[] elements;
}
template <class T> void SeqStack<T> ::
_OverflowProcess () {
// 私有成员函数:栈满时扩容
T* newArray=new T[maxSize + INC_SIZE];
assert(newArray!=NULL); //断言内存分配成功
for(int i=0; i<=top; i++)
newArray[i]=elements[i]; // 复制原有数据
maxSize += INC_SIZE;
delete[] elements; // 释放原数组
elements = newArray; // 指向新数组
}
int main()
{
SeqStack <int>mystack;
for(int i=0;i<10;i++)
mystack.Push(i);
for(int i=9;i>=0;i--)
cout<<mystack.Locate(i)<<" ";
cout<<endl;
SeqStack <int>mystack2=mystack;
for(int i=0;i<10;i++)//测试
cout<<mystack2.Pop()<<" ";
cout<<endl;
SeqStack <int>mystack3;
for(int i=0;i<10;i++)
mystack3.Push(i);
for(int i=9;i>=0;i--)
cout<<mystack.Locate(i)<<" ";
cout<<endl;
mystack3=mystack;
for(int i=0;i<10;i++)
mystack3.Push(i);
for(int i=9;i>=0;i--)
cout<<mystack.Locate(i)<<" ";
cout<<endl;
return 0;
}
还有许多细节没补充
0 0
- 数据结构 动态可调数组 顺序栈
- 数据结构 栈(动态数组)
- 数据结构---动态顺序表
- 【数据结构】动态顺序表
- 【数据结构】顺序栈(顺序表动态实现)
- 数据结构栈stack的动态数组实现
- 复习(数据结构):栈:c语言:动态数组
- 【C++数据结构】动态数组栈的实现
- 数据结构7.动态数组
- 【C++数据结构】动态数组
- 数据结构之动态数组
- 数据结构-动态数组
- 数据结构_动态顺序表
- 数据结构_动态数组形式的顺序表相关操作C语言源代码
- 【数据结构】动态顺序栈的增删改查
- 数据结构-栈的动态顺序存储表示-初始化压栈弹栈
- c数据结构之顺序栈(数组实现1)
- C数据结构之顺序栈(数组实现2)
- 两个时间进行比较 使用NSCalendar 日历类进行对比
- win7 下mingw64 编译boost 1.59
- [百度之星复赛T5]
- UIViewController之间传递值的两种方式
- 图片 轮播
- 数据结构 动态可调数组 顺序栈
- lintcode-表达式求值-368
- 51nod 1019 逆序数 (归并|树状数组)
- 扫雷游戏
- simple introduction for redirection
- [sicily]1341. 明明的随机数
- debian/Ubuntu下postgres的一些操作总结(用户,建库。。。)
- Hello World
- 运用AJAX 获取天气