北理工数据结构第三章实验报告
数据结构作业第3章

1 第3章 栈、队列 1. 填空 (1) 设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5, 经过push,push,pop,push,pop,push,push后,输出序列是( ),栈顶指针为( )。
(2)栈通常采用的两种存储结构是( );其判定栈空的条件分别是( ),判定栈满的条件分别是( )。
(3)( )可作为实现递归函数调用的一种数据结构。 (4) 栈和队列是两种特殊的线性表,栈的操作特性是( ),队列的操作特性是( ),栈和队列的主要区别在于( )。
(5)循环队列的引入是为了克服( )。 (6) 数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为( )。
2. 选择题
(1)若一个栈的输入序列是1,2,3,„,n,输出序列的第一个元素是n,则第i个输出元素是( )。 A 不确定 B n-i C n-i-1 D n-i+1
(2) 设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5、e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的顺序是e2、e4、e3、e6、e5、e1,则栈S的容量至少应该是( )。 A 6 B 4 C 3 D 2
(3)一个栈的入栈序列是1,2,3,4,5,则栈的不可能的输出序列是( )。 A 54321 B 45321 C 43512 D 12345
(4)设计一个判别表达式中左右括号是否配对的算法,采用( )数据结构最佳 A 顺序表 B 栈 C 队列 D 链表
(5)在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印缓冲区,该缓冲区应该是一个( )结构。 A 栈 B队列 C 数组 D线性表
(6)一个队列的入队顺序是1,2,3,4,则队列的输出顺序是( )。 A 4321 B 1234 C 1432 D 3241
(7) 栈和队列的主要区别在于( )。 A 它们的逻辑结构不一样 B 它们的存储结构不一样 C 所包含的运算不一样 D 插入、删除运算的限定不一样
《数据结构》实验报告

苏州科技学院数据结构(C语言版)实验报告专业班级测绘1011学号10201151姓名XX实习地点C1 机房指导教师史守正目录封面 (1)目录 (2)实验一线性表 (3)一、程序设计的基本思想,原理和算法描述 (3)二、源程序及注释(打包上传) (3)三、运行输出结果 (4)四、调试和运行程序过程中产生的问题及采取的措施 (6)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)实验二栈和队列 (7)一、程序设计的基本思想,原理和算法描述 (8)二、源程序及注释(打包上传) (8)三、运行输出结果 (8)四、调试和运行程序过程中产生的问题及采取的措施 (10)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)实验三树和二叉树 (11)一、程序设计的基本思想,原理和算法描述 (11)二、源程序及注释(打包上传) (12)三、运行输出结果 (12)四、调试和运行程序过程中产生的问题及采取的措施 (12)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)实验四图 (13)一、程序设计的基本思想,原理和算法描述 (13)二、源程序及注释(打包上传) (14)三、运行输出结果 (14)四、调试和运行程序过程中产生的问题及采取的措施 (15)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)实验五查找 (17)一、程序设计的基本思想,原理和算法描述 (17)二、源程序及注释(打包上传) (18)三、运行输出结果 (18)四、调试和运行程序过程中产生的问题及采取的措施 (19)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19)实验六排序 (20)一、程序设计的基本思想,原理和算法描述 (20)二、源程序及注释(打包上传) (21)三、运行输出结果 (21)四、调试和运行程序过程中产生的问题及采取的措施 (24)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24)实验一线性表一、程序设计的基本思想,原理和算法描述:程序的主要分为自定义函数、主函数。
北邮数据结构实验3哈夫曼编码

数据结构实验报告实验名称:实验3——哈夫曼编码学生姓名:班级:班内序号:学号:日期:2013年11月24日1.实验要求利用二叉树结构实现赫夫曼编/解码器。
基本要求:1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5、打印(Print):以直观的方式打印赫夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
2. 程序分析2.1存储结构:struct HNode{char c;//存字符内容int weight;int lchild, rchild, parent;};struct HCode{char data;char code[100];}; //字符及其编码结构class Huffman{private:HNode* huffTree; //Huffman树HCode* HCodeTable; //Huffman编码表public:Huffman(void);void CreateHTree(int a[], int n); //创建huffman树void CreateCodeTable(char b[], int n); //创建编码表void Encode(char *s, string *d); //编码void Decode(char *s, char *d); //解码void differ(char *,int n);char str2[100];//数组中不同的字符组成的串int dif;//str2[]的大小~Huffman(void);};结点结构为如下所示:三叉树的节点结构:struct HNode//哈夫曼树结点的结构体{ int weight;//结点权值int parent;//双亲指针int lchild;//左孩子指针int rchild;//右孩子指针char data;//字符};示意图为:int weight int parent int lchild int rchild Char c 编码表节点结构:struct HCode//编码表结构体{char data;//字符char code[100];//编码内容};示意图为:基本结构体记录字符和出现次数:struct node{int num;char data;};示意图为:2.关键算法分析(1).初始化:伪代码:1.输入需要编译的文本内容2.将输入的内容保存到数组str1中3.统计出现的字符数目,并且保存到变量count中4.统计出现的不同的字符,存到str2中,将str2的大小存到dif中时间复杂度O(n!)(2).创建哈夫曼树算法伪代码:1.创建一个长度为2*n-1的三叉链表2.将存储字符及其权值的链表中的字符逐个写入三叉链表的前n个结点的data域,并将对应结点的孩子域和双亲域赋为空3.从三叉链表的第n个结点开始,3.1从存储字符及其权值的链表中取出两个权值最小的结点x,y,记录其下标x,y。
数据结构第三章链表 部分作业第3章_链表

数据结构第三章链表部分作业单链表的结点类(ListNode class)和链表类(List class)的类定义。
template <class Type> class List;//前视的类定义template <class Type> class ListNode {//链表结点类的定义friend class List<Type>;//List类作为友元类定义private:Type data;//数据域ListNode<Type> *link;//链指针域public:ListNode ( ) : link (NULL) { }//仅初始化指针成员的构造函数ListNode ( const Type& item ) : data (item), link (NULL) { }//初始化数据与指针成员的构造函数ListNode<Type> * getNode ( const Type& item, ListNode<Type> *next = NULL )//以item和next建立一个新结点ListNode<Type> * getLink ( ) { return link;} //取得结点的下一结点地址Type getData ( ) { return data; }//取得结点中的数据void setLink ( ListNode<Type> * next ) { link = next; }//修改结点的link指针void setData ( Type value ) { data = value; } //修改结点的data值};template <class Type> class List {//单链表类定义private:ListNode<Type> *first, *current;//链表的表头指针和当前元素指针public:List ( const Type& value ) { first = current = new ListNode<Type> ( value ); }//构造函数~List ( ) { MakeEmpty ( ); delete first; }//析构函数void MakeEmpty ( );//将链表置为空表int Length ( ) const;//计算链表的长度ListNode<Type> * Find ( Type value ); //搜索含数据value的元素并成为当前元素ListNode<Type> * Locate( int i ); //搜索第i个元素的地址并置为当前元素Type *GetData ( );//取出表中当前元素的值int Insert ( Type value ); //将value插在表当前位置之后并成为当前元素Type *Remove ( );//将链表中的当前元素删去, 填补者为当前元素ListNode<Type> * Firster ( ) { current = first; return first; }//当前指针定位于表头结点Type *First ( );//当前指针定位于表中第一个元素并返回其值Type *Next ( );//将当前指针进到表中下一个元素并返回其值int NotNull ( ) {return current != NULL; } //表中当前元素空否?空返回1, 不空返回0int NextNotNull ( ) {return current != NULL && current->link != NULL; }//当前元素下一元素空否?空返回1, 不空返回0};3-1线性表可用顺序表或链表存储。
北京理工大学数信实验报告

实验1 利用DFT 分析信号频谱一、实验目的1、加深对DFT 原理的理解。
2、应用DFT 分析信号的频谱。
3、深刻理解利用DFT 分析信号频谱的原理,分析实现过程中出现的现象及解决方法。
二、实验设备与环境计算机、MATLAB 软件环境。
三、实验基础理论1.DFT 与DTFT 的关系:有限长序列的离散时间傅里叶变换(e )j X ω 在频率区间(02)ωπ≤≤ 的N 个等间隔分布的点2(0k N 1)kk N πω=≤≤-上的N 个取样值可以有下式表示:2120(e )|(n)e(k)(0k N 1)N jkn j Nkk NX x X πωπω--====≤≤-∑由上式可知,序列(n)x 的N 点DFT (k)X ,实际上就是(n)x 序列的DTFT 在N 个等间隔频率点2(0k N 1)kk N πω=≤≤-上样本(k)X 。
2.利用DFT 求DTFT方法1:由(k)X 恢复出(e )j X ω的方法如下:由流程知:11(e )(n)e[(k)W]e N j j nkn j nNn n k X x X Nωωω∞∞----=-∞=-∞===∑∑∑继续整理可得到:12()(k)()Ni k kx e X N ωπφω==-∑其中(x)φ为内插函数:sin()2()sin()2N N ωφωω=方法2:实际在MATLAB 计算中,上述插值运算不见得是最好的办法。
由于DFT 是DTFT 的取样值,其相邻两个频率样本点的间距为2N π,所以如果我们增加数据的长度N ,使得到的DFT 谱线就更加精细,其包络就越接近DTFT 的结果,这样就可以利用DFT 计算DTFT 。
如果没有更多的数据,可以通过补零来增加数据长度。
3.利用DFT 分析连续信号的频谱采用计算机分析连续时间信号的频谱,第一步就是把连续信号离散化,这里需要进行两个操作:一是采样,二是截断。
对于连续时间非周期信号(t)a x ,按采样间隔T 进行采样,阶段长度M ,那么:1(j )(t)e(nT)e M j tj nTa a a n X x dt T x -∞-Ω-Ω-∞=Ω==∑⎰对(j )a X Ω 进行N 点频域采样,得到:2120(j )|(nT)e(k)M jkn Na a M kn NTX T x TX ππ--Ω==Ω==∑采用上述方法计算信号(t)a x 的频谱需要注意如下三个问题:(1)频谱混叠;(2)栅栏效应和频谱分辨率; (3)频谱泄露。
天津理工大学数据结构实验报告3

实验(三)实验名称二叉树的遍历软件环境 Windows98/2000, VC++6.0或turbo C硬件环境PⅡ以上微型计算机实验目的 理解二叉树的逻辑特点,掌握二叉链表存储结构,掌握二茬树遍历算法的递归与非递归实现实验内容(应包括实验题目、实验要求、实验任务等)二叉树的遍历利用二叉链表作为存储结构建立一棵二叉树,每个结点中存放一种水果名(例如apple、orange、banana等,并要求从键盘输入),结点数不少于5个。
要求分别以先序、中序和后序进行遍历,输出遍历结果。
并编写一递归算法,交换该二叉树中所有结点的左、右孩子。
实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)实验步骤及算法描述和流程:1. 创建二叉链表的结点存储结构及数据的输入输出函数因为每个结点所存储的数据类型为字符串,却无法使用字符串和String等数据类型,所以使用单链表作为结点所存储的数据类型。
1.1 数据的输入函数indata( )当输入的字符不为'0'时,以尾插法将数据插入单链表。
1.2 数据的输出函数直接输出单链表。
2. 生成二叉链表利用先序遍历生成二叉链表:2.1 用单链表s记录输入的数据2.2 若单链表s为空,则二叉链表结点为空,否则根节点=s,利用递归调用分别生成根节点的左子树和右子树2.3 返回二叉链表3. 先序遍历、中序遍历、后序遍历二叉链表3.1 先序遍历:访问根节点,左子树,右子树的顺序3.2 中序遍历:访问左子树,根节点,右子树的顺序3.3 后序遍历:访问左子树,右子树,根节点的顺序利用递归调用分别用以上三种顺序遍历二叉链表。
4. 交换二叉链表的左右孩子当二叉链表的结点左孩子或者右孩子都不为空时,利用递归调用,分别交换左子树很右孩子的左右孩子,最后将根节点的左右孩子指针交换。
5. 主函数5.1 调用生成二叉链表的函数,从键盘输入二叉链表的各个结点5.2 分别调用先序遍历、中序遍历、后序遍历二叉链表函数,输出所有结点5.3 交换二叉链表的左右孩子5.4 重复5.2结论: 输入各个结点:apple、pear、orange、banana、peach、grape、watermelon 先序遍历输入与输入一致 中序遍历输出:orange、pear、banana、apple、grape、peach、watermelon 后序遍历输出:orange、banana、pear、grape、watermelon、peach、apple 交换二叉树的左右孩子后 先序遍历输出:apple、peach、watermelon、grape、pear、banana、orange编程中出现的问题:输入的二叉链表左右子树必须对称,如果不对称,交换二叉树的左右子树后,程序出错,不知道出错在哪,没有调试成功。
北邮数据结构实验报告三题目2-哈夫曼树
11.实验要求利用二叉树结构实现哈夫曼编/ 解码器(1). 初始化:能够对输入的任意长度的字符串s 进行统计,统计每个字符的频度,并建立哈夫曼树。
(2). 建立编码表:利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。
(3). 编码:根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
(4). 译码:利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。
(5). 打印:以直观的方式打印哈夫曼树。
(6). 计算输入的字符串编码前和编码后的长度,并进行分析,讨论哈夫曼编码的压缩效果。
(7). 用户界面可以设计成“菜单”方式,能进行交互,根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。
2.程序分析2.1存储结构二叉树:示意图:root2.21{2.3 关键算法分析1. 定义哈夫曼树的模板类#include <iostream>#include <string.h> using namespace std; structLNode {char ch;int weight;char code[20];LNode* next; };struct TNode{int weight; //int Lchild; //int Rchild; //int Parent; // };class Huffman 结点权值左孩子指针右孩子指针双亲指针// 链表的节点, 用来统计字符频率,并编码// 字符// 权值// 字符编码// 指向下一个节点// 哈弗曼树结点的结构体1 public:Huffman(); ~Huffman(); void CreateTable(); void PrintTable(); void Encoding(); void Decoding(); void Comrate();// 构造函数,输入、统计字符,创建哈弗曼树、码表// 释放链表空间、哈弗曼树的节点// 建立编码表,并将信息存入链表// 输出码表// 哈弗曼编码// 译码void SelectMin(int &x,int &y,int begin,int end);void reverse(char ch[]); voidcontrol();private: // 选取权值最小的两个数,创建哈弗曼树// 将码值倒置,用来编码// 对菜单交互等提示操作TNode* troot;LNode* lroot; void List(char a[]); void HTree(); int Letter; char astr[1000]; char bstr[1000]; // 在统计字符频率是构建链表的根节点// 统计字符的权值建立的单链表// 哈弗曼树建立// 共有不同字符总数// 用户输入的一串字符// 将字符串的码值保存Huffman::Huffman(){lroot=new LNode;bstr[0]='\0';lroot->next=NULL;Letter=0; // 初始化字符总数为1 cout<<" 请输入一串字符,以回车键结束"<<endl;cin.getline(astr,1000,'\n');if(strlen(astr)==0) throw 1;else{List(astr); // 用链表存储每个字符HTree();CreateTable();Encoding();}};Huffman::~Huffman(){delete troot;LNode* p=lroot;while(p=lroot->next)1{{ lroot=p->next; delete p; p=lroot;}delete p; };2. 建立哈夫曼树void Huffman::HTree(){LNode* p=lroot; int a=0;troot=new TNode[2*Letter-1]; //2n-1 while (p=p->next){troot[a].weight=p->weight; troot[a].Parent=-1; troot[a].Lchild=-1; troot[a].Rchild=-1; a++;};for (int i=Letter;i<2*Letter-1;i++)troot[i].Parent=-1; int x,y,begin=0;for (int j=Letter;j<2*Letter-1;j++) while (troot[begin].Parent!=-1)begin++;个结点// 建立叶子节点// 是两个最小值的角标SelectMin(x,y,begin,j);troot[j].weight=troot[x].weight+troot[y].weight;troot[j].Lchild=x;troot[j].Rchild=y;troot[j].Parent=-1;troot[x].Parent=j;troot[y].Parent=j;}};3.统计字符的频率void Huffman::List(char a[]){LNode *p=lroot;int i=0;while(a[i]!='\0'){{while (p&&p->ch!=a[i]) // 查找链表中没有该字符或者找到该字符p=p->next;if (!p) // 如果没有该字符,创建节点。
北京理工大学-数据结构实验报告-实验四--图书管理系统
实验四图书管理系统姓名:任子龙学号:1120140167 班级:05111451一。
需求分析(1)问题描述有一个小型书库保管了大量图书,关于图书有大量信息需要处理,这些信息包括图书的分类、书名、作者名、购买日期、价格等。
现要求编写一个程序以便于对图书的管理。
(2)基本要求:a.建立图书信息.b.提供查找功能,按照多种关键字查找需要的书籍。
例如按书名查找,输入书名后,将显示出该图书的所有信息,或显示指定信息。
c.提供排序功能,按照多种关键字对所有的书籍进行排序,例如按出版日期进行排序。
d.提供维护功能,可以对图书信息进行添加、修改、删除等功能。
(3)数据结构与算法分析将每一本书看作是一个基本单元。
由于涉及添加、修改操作,这里使用了链表作为数据存储结构;同时,考虑到排序功能,尝试使用双向链表。
其中,每本书作为一个结点,数据域包含char 型变量,指针域含有左右指针left和right。
二.概要设计1。
抽象数据类型的定义为实现上述功能,程序中使用了双向链表,只需要定义一种数据类型:typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;注意结点的指针域有left和right两个。
2.本程序包含两个模块(1)主程序模块主函数只包含了Menu_select()函数。
目的是进入主菜单界面,进行功能选择;直到输入操作码0,退出系统;(2)双向链表单元模块——实现书籍信息的链式存储的抽象数据类型.各函数之间的调用关系:三。
详细设计1。
结点类型typedef struct book{char number[10];char title[20];char author[10];char date[15];char price[10];struct book *right;struct book *left;}BK;2.子函数(1)功能菜单调用函数Menu_select()使用户进入主菜单界面,进行功能选择;先进入无限循环,输入操作码进行系统管理工作,直到输入操作码0,退出系统;(2)各种功能函数Initialize()//初始化图书系统信息;Insert()//添加新的图书信息;Sort()//对图书进行排序,本程序可以实现按“图书编号”、“出版日期"、“图书价格”多种关键字进行排序;Search()//实现对图书的查找功能,本程序可以实现按“图书编号"、“出版日期”、“图书价格”多种关键字进行查找;deletebook()//删除无效的图书信息;Print_book()//打印全部图书信息。
东北大学数据结构第三章
A simple single Linked List
Address Header H 31 1 7 13 19 25 31 37 43 Data Item LI QIAN SUN WANG WU ZHAO ZHENG ZHOU Links 43 13 1 NULL 37 7 19 25
Software College Northeastern University
Data Structure Software College Northeastern University
Variable-length arrays?
Solution: -The list is not need to store contiguously. -Attach a pointer to each item in the array, which points to the next item. -provides the ability to add or remove the items anywhere in the list in constant time ִThis is a linked list ִLinked lists are unbounded (maximum number of items limited only by memory)
newnode p last (Before) Before)
Data Structure
newnode p last
(After) After)
Software College Northeastern University
北理工编译原理实验报告(3篇)
第1篇一、实验目的1. 理解编译原理的基本概念和原理。
2. 掌握编译过程的基本步骤,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
3. 熟悉编译器开发工具和环境的使用。
4. 通过实验加深对编译原理的理解,提高编程能力。
二、实验内容本次实验选择了北理工编译原理课程中的一个典型实验项目:简单算术表达式编译器的设计与实现。
三、实验原理编译原理是计算机科学中研究将源代码转换为机器代码的理论和实践的学科。
编译过程主要包括以下几个阶段:1. 词法分析:将源代码中的字符序列转换为一个个有意义的记号(Token)。
2. 语法分析:根据语言的语法规则,对记号序列进行结构分析,判断其是否符合语法规则。
3. 语义分析:对语法分析后的抽象语法树(AST)进行语义检查,确保其符合语义规则。
4. 中间代码生成:将AST转换为中间代码,便于进行代码优化。
5. 代码优化:对中间代码进行优化,提高目标代码的执行效率。
6. 目标代码生成:将优化后的中间代码转换为特定机器上的目标代码。
四、实验步骤1. 词法分析器设计:- 设计词法分析器,识别算术表达式中的各种记号,如数字、运算符、括号等。
- 使用有限状态自动机(FSM)或正则表达式进行词法分析。
2. 语法分析器设计:- 设计语法分析器,根据算术表达式的语法规则,对词法分析器生成的记号序列进行语法分析。
- 使用递归下降分析、LL(1)分析或LR(1)分析等方法进行语法分析。
3. 语义分析器设计:- 设计语义分析器,对语法分析后的抽象语法树进行语义检查,确保其符合语义规则。
- 检查运算符优先级、运算符结合性、类型匹配等问题。
4. 中间代码生成:- 设计中间代码生成器,将抽象语法树转换为中间代码。
- 选择合适的中间代码表示方法,如三地址代码、四地址代码等。
5. 代码优化:- 设计代码优化器,对中间代码进行优化,提高目标代码的执行效率。
- 采用常见的优化技术,如常数折叠、死代码消除、循环优化等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北理工数据结构第三章实验报告第三章作业1、写出下列程序段的输出结果。
viod main ( ){ Stack S;char x, y;InitStack (S);x=’c’; y=’k’;Push(S, x); Push(S, ’a’); Push(S, y);Pop(S, x); Push(S, ’t’); Push(S, x);Pop(S, x); Push(S, ’s’);while ( ! StackEmpty(S) ){ Pop(S, y);printf (y);}printf(x);}stac k2、简述下列算法的功能(栈的元素类型SElemType为int)。
(1)Ststus algo1(Stack S){ int I, n, A[255];n=0;while ( ! StackEmpty(S) ){ n++; Pop(S, A[n]);}for ( i=1; i<=n; i++ )Push(S, A[n]);}将栈S中的元素以出栈的顺序排在数组中,且出栈的先后和数组的序号从小到大一致。
栈S变成空栈。
然后再从前到后输出数组中的数。
(2)Status algo2(Stack S, int e){ Stack T; int d;InitStack (T);while ( ! StackEmpty(S) ){ Pop(S, d);if ( d!=e ) Push(T, d);}while ( ! StackEmpty(T) ){ Pop (T, d);Push (S, d);}}将和e一致的数排到栈底,其他元素前后顺序保持不变。
3、设有4个元素1、2、3、4依次进栈,而出栈操作可随时进行(进出栈可任意交错进行,但要保证进栈次序不破坏1、2、3、4的相对次序),请写出所有可能的出栈次序。
可能次序:(1243)(1234)(1324)(1342)(1432)(2143)(2134)(2341)(2431)(2314)(3214)(3421)(3241)(4321)4、写出下列程序段的输出结果(队列中的元素类型QelemType 为char)。
viod main ( ){ Queue Q; InitQueue(Q);char x=’e’, y=’c’;EnQueue(Q, ’h’); EnQueue(Q, ’r’); EnQueue(Q, y);DeQueue(Q, x); EnQueue(Q, x);DeQueue(Q, x); EnQueue(Q,’a’);while ( ! QueueEmpty(Q) ){ DeQueue(Q, y);printf(y);}}答案:cha5、简述下列算法的功能(栈和队列的元素类型均为int)。
void algo3(Queue &Q){ Stack S; int d;InitStack (S);while ( ! QueueEmpt(Q) ){ DeQueue(Q, d); Push(S, d);}while ( ! StackEmpty(S) ){ Pop(S, d); EnQueue(Q, d);}}将队列Q中的元素的出列次序整个颠倒。
6、为了充分利用空间,将两个栈共同存储在长度为n的一维数组中,共享数组空间。
设计两个栈共享一维数组的存储表示方式,画出示意图。
栈顶栈底栈底实验二1、简单计算器。
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求:①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
②输入表达式中的数值均为大于等于零的整数。
中间的计算过程如果出现小数也只取整。
例如,输入:4+2*5= 输出:14输入:(4+2)*(2-10)= 输出:-48#include#include#define MaxSize 99void translate(char str[],char exp[]) /*将算术表达式转换成后缀表达式*/{struct{char data[MaxSize];int top; /*top为栈顶*/}op; /*定义一个含data和top的结构体*/char ch;int i = 0,t = 0;op.top = -1;ch = str[i]; /*将str的每一个数转换成ch*/i++;while(ch != '\0') /*ch对应不同的符号的时候对应的转换情况*/ {switch(ch){case '(': /*当是(的时候,将此括号存入栈op*/op.top++;op.data[op.top]=ch;break;case ')':while(op.data[op.top] != '(') /*括号内的转换优先级最高,故先提取表达式*/{exp[t]=op.data[op.top];op.top--;t++;}op.top--;break;case '+':case '-':while(op.top != -1&&op.data[op.top] != '('){exp[t] = op.data[op.top];op.top--;t++;}op.top++; /*恢复可插入位置*/op.data[op.top] = ch;break;case '*':case '/':while(op.top == '/'||op.top == '*') /*优先级*/{exp[t] = op.data[op.top];op.top--;t++;}op.top++;op.data[op.top] = ch;break;case ' ': /*忽略空格,排除误操作*/break;default:while(ch >= '0'&&ch <= '9'){exp[t] = ch;t++;ch = str[i];i++;}i--;exp[t] = '#'; /*分隔操作数,为了美观,也为了以后好分隔操作数,呵呵*/t++;}ch = str[i];i++;}while(op.top != -1) /*得到剩下的部分*/{exp[t] = op.data[op.top];t++;op.top--;}exp[t] = '\0'; /*表达式结束*/}float cal_value(char exp[]){struct{float data[MaxSize];int top;}st; /*操作数栈*/float d;char ch;int t = 0;st.top = -1;ch = exp[t];t++;while(ch != '\0'){switch(ch) /*运算主体*/{case '+':st.data[st.top-1] = st.data[st.top-1]+st.data[st.top]; st.top--;break;case '-':st.data[st.top-1] = st.data[st.top-1]-st.data[st.top]; st.top--;break;case '*':st.data[st.top-1] = st.data[st.top-1]*st.data[st.top]; st.top--;break;case '/':if(st.data[st.top] != 0)st.data[st.top-1]=st.data[st.top-1]/st.data[st.top]; else{printf("\n\t除0是错误的");}st.top--;break;default:d=0;while(ch >= '0'&&ch <= '9') /*从后缀表达式中获取操作数,#作用在此体现*/{d = 10*d+ch-'0';ch = exp[t];t++;}st.top++;st.data[st.top] = d;}ch = exp[t];t++;}return st.data[st.top];}int main() /*可以提到前面去*/{char str[MaxSize],exp[MaxSize]; /*str为算术表达式,exps为后缀表达式*/printf("表达式:");gets(str); /*输入一个算术表达式*/translate(str,exp); /*将算术表达式转换成后追表达式*/printf("计算结果:%g\n",cal_value(exp));/*通过后缀表达式来求值*/system("pause"); return 0;}。