博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法导论 使用单链表实现栈
阅读量:4089 次
发布时间:2019-05-25

本文共 3392 字,大约阅读时间需要 11 分钟。

使用单链表实现栈

1. 算法导论原题

10.2-2

Implement a stack using a singly linked list L. The operations PUSH and POP should still take O(1) time.
译:使用一个单链表实现一个栈。PUSH和POP操作仍然需要保持O(1)时间复杂度。

2. 如何使用单链表实现栈?

栈的主要原理就是后进先出,又因为原题需要保持PUSH和POP的时间复杂度是1,因此不可能把后进的元素放在链表尾,故每次PUSH的时候都需要把元素放在头节点的后面。所以PUSH和POP操作并不需要遍历整个链表,因而时间复杂度可以做到O(1)。

3. 使用单链表实现栈(C++代码)

//StackBySinglyLink.h#pragma once#include "SinglyLinkList.h"template
class StackBySinglyLink{public: StackBySinglyLink(); bool Push(ElemType elem); bool Pop(ElemType* elem); bool Empty(); unsigned int GetLength() const; bool Visit(ElemType* elem, const unsigned int& pos) const;private: SinglyLinkList
* m_pSinglyLink;};template
bool StackBySinglyLink
::Empty(){ return m_pSinglyLink->Empty();}template
unsigned int StackBySinglyLink
::GetLength() const{ return m_pSinglyLink->GetLength();}template
bool StackBySinglyLink
::Pop(ElemType* elem){ return m_pSinglyLink->Delete(0,elem);}template
bool StackBySinglyLink
::Push(ElemType elem){ if (m_pSinglyLink->Insert(elem,0)) { return true; } else { assert(false && "Error: StackBySinglyLink Push failed for allocate node"); return false; }}template
StackBySinglyLink
::StackBySinglyLink() : m_pSinglyLink(new SinglyLinkList
()){}template
bool StackBySinglyLink
::Visit(ElemType* elem, const unsigned int& pos) const{ return m_pSinglyLink->Visit(elem,pos);}
//Util.h#pragma oncenamespace Util{    template
void PrintMemory(const T& dateStruct, unsigned int size) { cout << "PrintMemory: "; for (int i = 0; i != size; i++) { ElemType tempElem; if (!dateStruct.Visit(&tempElem,i)) { printf("\n"); return; } printf("%d ",tempElem); } printf("\n"); }}
//main.cpp#include "StackBySinglyLink.h"#include "Util.h"#include 
using namespace std;typedef int ElemType;int main(){ StackBySinglyLink
testStackBySinglyLink; Util::PrintMemory(testStackBySinglyLink,testStackBySinglyLink.GetLength()); cout << (testStackBySinglyLink.Empty() ? "Empty StackBySinglyLink." : "Not Empty StackBySinglyLink.") << endl; for (int i = 1; i != 5; i++) { testStackBySinglyLink.Push(i); cout << "\nPush:" << i << endl; Util::PrintMemory(testStackBySinglyLink,testStackBySinglyLink.GetLength()); cout << (testStackBySinglyLink.Empty() ? "Empty StackBySinglyLink." : "Not Empty StackBySinglyLink.") << endl; } for(int i = 1; i!= 5; i++) { int temp; testStackBySinglyLink.Pop(&temp); cout << "\nPop:" << temp << endl; Util::PrintMemory(testStackBySinglyLink,testStackBySinglyLink.GetLength()); cout << (testStackBySinglyLink.Empty() ? "Empty StackBySinglyLink." : "Not Empty StackBySinglyLink.") << endl; } return 0;}

4. 程序运行结果

PrintMemory:

Empty StackBySinglyLink.

Push:1

PrintMemory: 1
Not Empty StackBySinglyLink.

Push:2

PrintMemory: 2 1
Not Empty StackBySinglyLink.

Push:3

PrintMemory: 3 2 1
Not Empty StackBySinglyLink.

Push:4

PrintMemory: 4 3 2 1
Not Empty StackBySinglyLink.

Pop:4

PrintMemory: 3 2 1
Not Empty StackBySinglyLink.

Pop:3

PrintMemory: 2 1
Not Empty StackBySinglyLink.

Pop:2

PrintMemory: 1
Not Empty StackBySinglyLink.

Pop:1

PrintMemory:
Empty StackBySinglyLink.

转载地址:http://hnyii.baihongyu.com/

你可能感兴趣的文章
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
国内有个码云,gitee
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>