-----------------
第七课  堆栈与队列
一、数据结构的基本概念
1.逻辑结构
1)集合结构(集):结构中的元素除了同属一个集之外,没有任何联系。
2)线性结构(表):结构中的元素具有一对一的前后关系。
3)树型结构(树):结构中的元素具有一对多的父子关系。
4)网状结构(图):结构中的元素具有多对多的交叉映射关系。
2.物理结构
1)顺序结构(数组):结构中的元素存放在一段连续的地址空间中。随机访问方便,空间利用率低,插入删除不便。
2)链式结构(链式):结构中的元素存放在彼此独立的地址空间中,每个独立的地址空间被称为节点,节点除了保存数据以外,还保存另外一个或几个相关节点的地址。空间利用率高,插入删除方便,随机访问不便。
3.逻辑结构和物理结构的关系
表    树  图
顺序 数组 顺序树 复  
链式 链表 链式树 合
二、数据结构的基本运算
1.创建与销毁
2.插入与删除
3.获取与修改
4.排序与查找
三、堆栈
1.基本特征:后进先出
2.基本操作:压入(push),弹出(pop)
3.实现要点:初始化空间,栈顶指针,判空判满。
1234
1*9^3+2*9^2+3*9^1+4*9^0 -> 4
123 -> 3
12 -> 2
1 -> 1

format.cpp
#include <iostream>
#include <fstream>
using namespace std;
int main (void) {ofstream ofs ("format.txt");if (! ofs) {perror ("打开文件失败");return -1;}ofs << 1234 << ' ' << 56.78 << ' ' << "tarena"<< '\n';ofs.close ();ofs.open ("format.txt", ios::app);if (! ofs) {perror ("打开文件失败");return -1;}ofs << "append_a_line\n";ofs.close ();ifstream ifs ("format.txt");if (! ifs) {perror ("打开文件失败");return -1;}int i;double d;string s1, s2;ifs >> i >> d >> s1 >> s2;cout << i << ' ' << d << ' ' << s1 << ' '<< s2 << endl;ifs.close ();return 0;
}

istack.cpp

#include <iostream>
using namespace std;
// 基于链式表的堆栈
class Stack {
public:// 构造过程中初始化为空堆栈Stack (void) : m_top (NULL) {}// 析构过程中销毁剩余的节点~Stack (void) {for (Node* next; m_top; m_top = next) {next = m_top->m_next;delete m_top;}}// 压入void push (int data) {/*Node* node = new Node;node->m_data = data;node->m_next = m_top;m_top = node;*/m_top = new Node (data, m_top);}// 弹出int pop (void) {if (empty ())throw UnderFlow ();int data = m_top->m_data;Node* next = m_top->m_next;delete m_top;m_top = next;return data;}// 判空bool empty (void) const {return ! m_top;}
private:// 下溢异常class UnderFlow : public exception {const char* what (void) const throw () {return "堆栈下溢!";}};// 节点class Node {public:Node (int data = 0, Node* next = NULL) :m_data (data), m_next (next) {}int m_data; // 数据Node* m_next; // 后指针
    };Node* m_top; // 栈顶
};
int main (void) {try {Stack stack;for (int i = 0; i < 10; ++i)stack.push (i);while (! stack.empty ())cout << stack.pop () << endl;
//        stack.pop ();
    }catch (exception& ex) {cout << ex.what () << endl;return -1;}return 0;
}

putget.cpp

#include <iostream>
#include <fstream>
using namespace std;
int main (void) {ofstream ofs ("putget.txt");if (! ofs) {perror ("打开文件失败");return -1;}for (char c = ' '; c <= '~'; ++c)if (! ofs.put (c)) {perror ("写入文件失败");return -1;}ofs.close ();ifstream ifs ("putget.txt");if (! ifs) {perror ("打开文件失败");return -1;}char c;while ((c = ifs.get ()) != EOF)cout << c;cout << endl;if (! ifs.eof ()) {perror ("读取文件失败");return -1;}ifs.close ();return 0;
}

seek.cpp

#include <iostream>
#include <fstream>
using namespace std;
int main (void) {fstream fs ("seek.txt", ios::in | ios::out);if (! fs) {perror ("打开文件失败");return -1;}fs << "0123456789";cout << fs.tellp () << endl;cout << fs.tellg () << endl;fs.seekp (-3, ios::cur);fs << "XYZ";fs.seekg (4, ios::beg);int i;fs >> i;cout << i << endl;cout << fs.tellg () << endl;cout << fs.tellp () << endl;fs.seekg (-6, ios::end);fs << "ABC";fs.close ();return 0;
}

stack.cpp

#include <iostream>
using namespace std;
// 基于顺序表的堆栈
class Stack {
public:// 构造过程中分配内存Stack (size_t size = 10) :m_array (new int[size]), m_size (size),m_top (0) {}// 析构过程中释放内存~Stack (void) {if (m_array) {delete[] m_array;m_array = 0;}}// 压入void push (int data) {if (full ())throw OverFlow ();m_array[m_top++] = data;}// 弹出int pop (void) {if (empty ())throw UnderFlow ();return m_array[--m_top];}// 判满bool full (void) const {return m_top >= m_size;}// 判空bool empty (void) const {return ! m_top;}
private:// 上溢异常class OverFlow : public exception {const char* what (void) const throw () {return "堆栈上溢!";}};// 下溢异常class UnderFlow : public exception {const char* what (void) const throw () {return "堆栈下溢!";}};int* m_array; // 数组size_t m_size; // 容量size_t m_top; // 栈顶
};
void printb (unsigned int numb, int base) {Stack stack (256);do {stack.push (numb % base);}    while (numb /= base);while (! stack.empty ()) {int digit = stack.pop ();if (digit < 10)cout << digit;elsecout << char (digit - 10 + 'A');}cout << endl;
}
int main (void) {try {Stack stack;for (int i = 0; ! stack.full (); ++i)stack.push (i);
//        stack.push (0);while (! stack.empty ())cout << stack.pop () << endl;
//        stack.pop ();
    }catch (exception& ex) {cout << ex.what () << endl;return -1;}cout << "输入一个整数:" << flush;int numb;cin >> numb;cout << "您想看几进制:" << flush;int base;cin >> base;cout << "结果:";printb (numb, base);return 0;
}

stream.cpp

#include <iostream>
#include <iomanip>
#include <cmath>
#include <fstream>
#include <sstream>
using namespace std;
int main (void) {cout << sqrt (2) << endl;cout.precision (10); // 10位有效数字cout << sqrt (2) << endl;cout << sqrt (2) * 100 << endl;cout << setprecision (5) << sqrt (2) << endl<< sqrt (2) * 100 << endl;cout << "当前精度:" << cout.precision ()<< endl;cout << setprecision (2) << 1.24 << ' ' << 1.25<< ' ' << 1.26 << endl;cout << showbase << hex << 127 << endl;cout << oct << 127 << endl;cout << dec << 127 << endl;cout << noshowbase << hex << 127 << dec << endl;cout << setw (12) << 127 << 721 << endl;cout << setfill ('$') << left << setw (12)<< 127 << endl;cout.precision (10);cout.setf (ios::scientific);cout << sqrt (2) << endl;cout.setf (ios::fixed);cout << sqrt (2) << endl;cout << 12.00 << endl;cout << showpoint << 12.00 << endl;cout << noshowpoint << 12.00 << endl;ifstream ifs ("stream.txt");ifs.unsetf (ios::skipws);char c;while (ifs >> c)cout << c;ifs.setf (ios::skipws);ifs.clear (); // 复位
    ifs.seekg (ios::beg);while (ifs >> c)cout << c;ifs.close ();cout << endl;int i = 1234;double d = 56.78;string s = "tarena";ostringstream oss;oss << i << ' ' << d << ' ' << s;string str = oss.str ();cout << str << endl;str = "hello 3.14 pai";istringstream iss;iss.str (str);iss >> s >> d >> str;cout << s << ' ' << d << ' ' << str << endl;return 0;
}

write.cpp

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class Dog {
public:Dog (const string& name = "", int age = 0) :m_age (age) {strcpy (m_name, name.c_str ());}void print (void) const {cout << m_name << "," << m_age << endl;}
private:char m_name[128];int m_age;
};
int main (void) {ofstream ofs ("dog.dat");Dog dog ("小白", 25);ofs.write ((char*)&dog, sizeof (dog));ofs.close ();ifstream ifs ("dog.dat");Dog dog2;ifs.read ((char*)&dog2, sizeof (dog2));dog2.print ();ifs.close ();return 0;
}

xor.cpp

#include <iostream>
#include <fstream>
#include <stdexcept>
#include <cstdlib>
using namespace std;
#define BUFSIZE (1024*10)
int _xor (const char* src, const char* dst,unsigned char key) {ifstream ifs (src, ios::binary);if (! ifs) {perror ("打开源文件失败");return -1;}ofstream ofs (dst, ios::binary);if (! ofs) {perror ("打开目标文件失败");return -1;}char* buf = NULL;try {buf = new char[BUFSIZE];}catch (bad_alloc& ex) {cout << ex.what () << endl;return -1;}while (ifs.read (buf, BUFSIZE)) {for (size_t i = 0; i < BUFSIZE; ++i)buf[i] ^= key;if (! ofs.write (buf, BUFSIZE)) {perror ("写入文件失败");return -1;}}if (! ifs.eof ()) {perror ("读取文件失败");return -1;}for (size_t i = 0; i < ifs.gcount (); ++i)buf[i] ^= key;if (! ofs.write (buf, ifs.gcount ())) {perror ("写入文件失败");return -1;}delete[] buf;ofs.close ();ifs.close ();return 0;
}
int enc (const char* plain, const char* cipher) {srand (time (NULL));unsigned char key = rand () % 256;if (_xor (plain, cipher, key) == -1)return -1;cout << "密钥:" << (unsigned int)key << endl;return 0;
}
int dec (const char* cipher, const char* plain,unsigned char key) {return _xor (cipher, plain, key);
}
int main (int argc, char* argv[]) {if (argc < 3) {cerr << "用法:" << argv[0]<< " <明文文件> <密文文件>" << endl;cerr << "用法:" << argv[0]<< " <密文文件> <明文文件> <密钥>"<< endl;return -1;}if (argc < 4)return enc (argv[1], argv[2]);elsereturn dec (argv[1], argv[2],atoi (argv[3]));return 0;
}

转载于:https://www.cnblogs.com/xuxaut-558/p/10018349.html

6.1-数据结构算法-堆栈与队列相关推荐

  1. 数据结构之堆栈与队列

    堆栈与队列是两种重要的基础数据结构,一个是先入后出,一个是先入先出,有着广泛的应用,本文分别使用数组与链表实现堆栈与队列 顺序存储方式实现堆栈 #define MaxSize 20 #define E ...

  2. C# 数据结构 之 堆栈和队列

    堆栈(Stack)是一种特殊的线性表,是一种操作只允许在尾端进行插入或删除等操作的线性表.表尾允许进行插入删除操作,称为栈顶(Top),另一端是固定的,称为栈底(Bottom).栈的操作使按照先进后出 ...

  3. python堆栈与队列_python语言的堆栈与队列类的实现

    基于python语言的数据结构之堆栈与队列的实现 # 堆栈的实现 # -*- coding: utf-8 -*- """ 栈(stack), 是一种容器,可以存入数据元素 ...

  4. 数据结构与算法--4.使用堆栈模拟队列

    问题: 队列的插入和删除遵循先入先出的原则,而堆栈遵循后进先出的原则. 用两个堆栈模拟队列,要求实现时不能分配超过O(1)的内存,时间复杂度必须是o(m). 思路: 用两个堆栈模拟队列,必须要支持两种 ...

  5. 《数据结构与算法基础 严蔚敏版》第三章 堆栈与队列

    链接:https://pan.baidu.com/s/1z-kFKiNaezO0k2BWQ8l1Hw  提取码:asdf 1.堆栈 (1)堆栈的概念 栈:只允许在一段进行插入或删除操作的线性表 栈顶: ...

  6. Java LinkedList特有方法程序小解 使用LinkedList 模拟一个堆栈或者队列数据结构。...

    package Collection;import java.util.LinkedList;/* LinkedList:特有的方法 addFirst()/addLast(); getFirst()/ ...

  7. 算法与数据结构(part5)--栈与队列

    学习笔记,仅供参考,有错必纠 文章目录 算法与数据结构–基于python 栈 栈是什么 栈(ADT)的操作 栈的实现 队列 队列是什么 队列的操作 队列的实现 双端队列 双端队列是什么 双端队列的操作 ...

  8. linux 复制栈数据结构,算法-数据结构-堆栈

    算法-数据结构-堆栈 发布时间:2005-09-09 17:46:22来源:红联作者:frog /*************************************************** ...

  9. 使用LinkedList模拟一个堆栈或者队列数据结构

    使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList;public cla ...

  10. 数据结构与算法之循环队列的操作

    数据结构与算法之循环队列的操作 /* 循环队列的入队和出队算法设计 初始化循环队列 .打印队列.插入元素到循环队列.获取循环队列的首元素,元素不出队.出队.获取循环队列元素个数.判断循环队列的空和满. ...

最新文章

  1. c语言大项目经验,C语言该学的地方(项目经验)
  2. today便利 java_在Today今天便利店吃饭,你的要求可以再高一点
  3. python编程培训多少钱-想要学习Python,武汉Python编程培训费用是多少?
  4. redis windows下的环境搭建
  5. 将一正整数序列{K1,K2,…,K9}重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比K1大的数都在K1的右面(后续的再向右存放),从K1向右扫描
  6. Debian Security Advisory(Debian安全报告) DSA-4404-1 chromium
  7. JavaScript打开新页面的两种方式:当前页面打开和新页面跳转
  8. js实现oss批量下载文件_远程URL文件批量下载打包的方法
  9. php 失去焦点,jquery设置焦点方法focus()和jquery失去焦点方法blur()
  10. oracle数据库报错1033,ORACLE出现错误1033和错误ORA-00600的解决方法
  11. 锂电池参数的一些概念结合一块具体电池参数表的理解
  12. 《R语言入门与实践》学习笔记四
  13. can总线不加末端电阻_RS485总线专题讲解,从原理入手!
  14. java责任链模式审批请假_14-学生生病请假:责任链模式
  15. 嵌入式入门学习笔记1:资料收集
  16. 关于支付账户体系研究
  17. 洛谷P3799 妖梦拼木棒 题解
  18. 怎么样才能学好java_论新手该如何学习java?
  19. JavaScript 探查器工具
  20. VDD,DVDD,AVDD,VCC,AFVDD,DOVDD,IOVDD

热门文章

  1. Python类的私有属性
  2. HDU 5306 线段树
  3. 20169219《linux内核原理与分析》第七周作业
  4. 【debian】解决debian中文安装后出现乱码的问题
  5. MFC中 使用Tab Control 控件在对话框中添加属性页
  6. 对Javascript的原型,原型链和继承的个人理解
  7. CUDA memory
  8. [转载] ANTLR——语法分析
  9. 如何落地用户画像分析?
  10. Linux---文件权限的控制