数据结构 栈(动态数组)
来源:互联网 发布:淘宝企业店铺换公司 编辑:程序博客网 时间:2024/06/09 19:56
由静态数组实现的栈的的缺陷是明显的,他很容易造成空间的浪费或则空间不足;倘若我们在运行程序的时候是可以知道栈的大小的话,那么动态数组实现的栈无疑使最好的选择;当然,在动态数组中的栈,其构造函数要做的事远比静态的要多,此外还需要一些其他的函数成员:
(1)构造函数:处理动态数据成员的内存分配,并初始化所有的数据成员;
(2)析构函数:释放一个对象中所有的动态分配内存;
(3)复制构造函数:创建对象的复制;
(4)赋值运算符:将一个对象赋予另一个对象;
其他和静态实现的栈基本相同;静态实现的栈参考:http://blog.csdn.net/u013946585/article/details/37612547
1.构造函数:在静态数组的栈中因为数组已经存在,构造函数只需要初始化栈空即可,但在动态数组中则需要先创建一个合法的数组,然后再初始化栈空;
算法描述如下:
(1)检查给定的栈容量是否合法,若非法,则跳转至(6),否则执行(2)(2)设置capacity为number,执行(3)(3)分配一个容量为number的数组,由myArray指向其首地址(4)检查myArray是否为空,若空,则跳转至(6),否则执行(5)(5)设置myTop为-1;(6)结束程序
具体代码如下:
#include <iostream>using namespace std;typedef int stack_element;//动态栈的声明部分class stack{public :stack (int number = 128);stack (const stack & original); //复制构造函数~stack ();const stack & operator = (const stack & RightStack); //赋值运算符bool empty () const;void push (stack_element item);void display (ostream & out) const;stack_element top () const;void pop ();private :stack_element * myArray; //存储元素的动态数组int myTop; //栈顶int capacity; //栈的容量};//动态栈的实现部分//构造函数stack::stack (int number){if (number < 0)return;else{capacity = number;myArray = new (nothrow) stack_element[number];if (myArray)myTop = -1;elsecerr << "new a new myArray Error\n";}}//stack的复制构造函数的定义stack::stack (const stack & original) : capacity (original.capacity),myTop(original.myTop){//为复制创建一个新的数组myArray = new (nothrow) stack_element[capacity];if (myArray)for (int i=0; i<myTop; i++)myArray[i] = original.myArray[i];elsecerr << "Inadequate memeory to allocate stack\n";}//赋值运算符的定义const stack & stack::operator = (const stack & RightStack){if (this != &RightStack)//确定不是自我赋值{if (RightStack.capacity != capacity) //检查大小是否一样{delete [] myArray;capacity = RightStack.capacity;myArray = new (nothrow) stack_element[capacity];if (myArray==0)cerr << "Inadequate memeory to allocate stack\n";else{myTop = RightStack.myTop;for (int i=0; i<myTop; i++)myArray[i] = RightStack.myArray[i];}}}return *this;}stack::~stack (){delete [] myArray;}bool stack::empty () const{return myTop == -1;}void stack::display (ostream & out) const{for (int i=myTop; i>=0; i--)out << myArray[i] << endl;}void stack::push (stack_element item){if (myTop < capacity-1){myTop++;myArray[myTop] = item;}elsecerr << "Push Error\n";}stack_element stack::top () const{if (myTop != -1)return myArray[myTop];elsecerr << "Stack is Empty\n";}void stack::pop (){if (myTop != -1)myTop--;elsecerr << "Stack is Empty\n";}void print (stack s){s.display (cout);}//动态数组栈的测试部分int main (){int cap;cout << "Enter stack capacity: \n";cin >> cap;stack s(cap);cout << "stack created. Empty ?\n" << ((s.empty () ? "yes":"no")) << endl;cout << "How many elements to add to the stack ?\n";int number;cin >> number;for (int i=0; i<number; i++)s.push (i);cout << "stack empty ?\n" <<((s.empty () ? "yes":"no")) << endl;cout << "contents of stack s (via print ) :\n";print (s);cout << "\ncheck that stack wasn't modified by print :\n";s.display (cout);stack u,t;t = u = s;cout <<"contents of stack t and u after t = u = s :\n";cout << "u: \n";print (u);cout << "\nt: \n";print (t);cout << "\ntop value int t: "<< t.top () << endl;while (!t.empty ()){cout << "Poping t: "<<t.top() <<endl;t.pop ();}cout << "stack t empty ?\n" << ((t.empty () ? "yes":"no")) << endl;cout << "stack t top value " <<t.top () <<endl;return 0;}
0 0
- 数据结构 栈(动态数组)
- 数据结构栈stack的动态数组实现
- 数据结构 动态可调数组 顺序栈
- 复习(数据结构):栈:c语言:动态数组
- 【C++数据结构】动态数组栈的实现
- 数据结构7.动态数组
- 【C++数据结构】动态数组
- 数据结构之动态数组
- 数据结构-动态数组
- 数据结构之动态数组实现
- 数据结构动态申请二维数组
- java内置数据结构--数组与动态数组
- 复习(数据结构):动态数组:c_语言数组
- 数据结构实现(动态数组类模板)
- 用动态数组实现堆栈数据结构
- 数据结构(c语言)之动态数组
- 数据结构入门——动态数组
- 5.数据结构之通用动态数组
- JUnit4 中@AfterClass @BeforeClass @after @before的区别对比
- C#类的创建与初始化
- UILabel使用
- 同事做客我家
- MOOC——C语言5
- 数据结构 栈(动态数组)
- Windows Phone 图片操作
- 55555555555555555555555
- 分区索引重建
- 【Android开发日记】UTF8汉字编码还原成汉字
- Linux中的软件安装
- 集合框架知识点
- Android把手机作为FTP服务器,在PC端管理手机文件的简单实现
- CURL的学习和应用(附多线程实现)