- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构与算法北京大学2008张铭栈和队列
12 Sept, 2007 2007 Fall Data Structures Algorithms by Haiyan Zhao 操作受限的线性表 栈(Stack) 运算只在表的一端进行 队列(Queue) 运算只在表的两端进行 3.1 栈 后进先出(LastInFirstOut) 一种限制访问端口的线性表 栈存储和删除元素的顺序与元素到达的顺序相反 也称为“下推表” 栈的主要元素 栈顶(top)元素:栈的唯一可访问元素 元素插入栈称为“入栈”或“压栈”(push) 删除元素称为“出栈”或“弹出”(pop) 栈底:另一端 栈的示意图 每次取出(并被删除)的总是刚压进的元素,而最先压入的元素则被放在栈的底部 当栈中没有元素时称为“空栈” 栈的主要操作 入栈( push ) 出栈(pop) 取栈顶元素( top ) 判断栈是否为空( isEmpty ) 3.1.1 栈的抽象数据类型 template class T // 栈的元素类型为 T class Stack { public: // 栈的运算集 void clear(); // 变为空栈 bool push(const T item); // item入栈,成功则返回真,否则返回假 bool pop(T item); // 返回栈顶内容并弹出,成功返回真,否则返回假 bool top(T item); // 返回栈顶内容但不弹出,成功返回真,否则返回假 bool isEmpty(; // 若栈已空返回真 bool isFull(); // 若栈已满返回真 }; 栈的实现方式 顺序栈(Array-based Stack) 使用向量实现,本质上是顺序表的简化版 栈的大小 关键是确定哪一端作为栈顶 链式栈(Linked Stack) 用单链表方式存储,其中指针的方向是从栈顶向下链接 3.1.2 顺序栈 template class T class arrStack : public Stack T { private: // 栈的顺序存储 int mSize; // 栈中最多可存放的元素个数 int top; // 栈顶位置,应小于mSize T *st; // 存放栈元素的数组 public: // 栈的运算的顺序实现 arrStack(int size) { // 创建一个给定长度的顺序栈实例 mSize = size; top = -1; st = new T[mSize]; } arrStack() { // 创建一个顺序栈的实例 top = -1; } ~arrStack() { // 析构函数 delete [] st; } void clear() { // 清空栈内容 top = -1; } } 顺序栈 按压入先后次序,最后压入的元素编号为4,然后依次为3,2,1 顺序栈示意 顺序栈的溢出 上溢(Overflow) 当栈中已经有maxsize个元素时,如果再做进栈运算,所产生的现象 下溢(Underflow) 对空栈进行出栈运算时所产生的现象 顺序栈 若入栈的顺序为1,2,3,4的话,则出栈的顺序可以有哪些? 1234 1243 1324 1342 1423 1432 2134 2143 …… 压入栈顶 bool arrStackT::push(const T item) { if (top == mSize-1) { // 栈已满 cout 栈满溢出 endl; return false; } else { // 新元素入栈并修改栈顶指针 st[++top] = item; return true; } } 从栈顶弹出 bool arrStackT::pop(T item) { // 出栈的顺序实现 if (top == -1) { // 栈为空 cout 栈为空,不能执行出栈操作 endl; return false; } else { item = st[top--]; // 返回栈顶元素并修改栈顶指针 return true; } } 从栈顶读取,但不弹出 bool arrStackT:: top(T item) { // 返回栈顶内容,但不弹出 if (top == -1) { // 栈空 cout 栈为空,不能读取栈顶元素 endl; return false; } else {
文档评论(0)