栈和队列——数据结构实验报告

合集下载

栈和队列的实验报告

栈和队列的实验报告

栈和队列的实验报告栈和队列的实验报告引言:栈和队列是计算机科学中常用的数据结构,它们在算法设计和程序开发中起着重要的作用。

本实验旨在通过实际操作和观察,深入理解栈和队列的概念、特点以及它们在实际应用中的作用。

一、栈的实验1.1 栈的定义和特点栈是一种具有特殊操作约束的线性数据结构,它的特点是“先进后出”(Last-In-First-Out,LIFO)。

栈的操作包括入栈(push)和出栈(pop),入栈操作将元素放入栈顶,出栈操作将栈顶元素移除。

1.2 实验步骤在本次实验中,我们使用编程语言实现了一个栈的数据结构,并进行了以下实验步骤:1.2.1 创建一个空栈1.2.2 向栈中依次压入若干元素1.2.3 查看栈顶元素1.2.4 弹出栈顶元素1.2.5 再次查看栈顶元素1.3 实验结果通过实验,我们观察到栈的特点:最后入栈的元素最先出栈。

在实验步骤1.2.2中,我们依次压入了元素A、B和C,栈顶元素为C。

在实验步骤1.2.4中,我们弹出了栈顶元素C,此时栈顶元素变为B。

二、队列的实验2.1 队列的定义和特点队列是一种具有特殊操作约束的线性数据结构,它的特点是“先进先出”(First-In-First-Out,FIFO)。

队列的操作包括入队(enqueue)和出队(dequeue),入队操作将元素放入队尾,出队操作将队头元素移除。

2.2 实验步骤在本次实验中,我们使用编程语言实现了一个队列的数据结构,并进行了以下实验步骤:2.2.1 创建一个空队列2.2.2 向队列中依次插入若干元素2.2.3 查看队头元素2.2.4 删除队头元素2.2.5 再次查看队头元素2.3 实验结果通过实验,我们观察到队列的特点:最先入队的元素最先出队。

在实验步骤2.2.2中,我们依次插入了元素X、Y和Z,队头元素为X。

在实验步骤2.2.4中,我们删除了队头元素X,此时队头元素变为Y。

三、栈和队列的应用栈和队列在实际应用中有广泛的应用场景,下面简要介绍一些常见的应用:3.1 栈的应用3.1.1 表达式求值:通过栈可以实现对表达式的求值,如中缀表达式转换为后缀表达式,并计算结果。

数据结构栈和队列实验报告

数据结构栈和队列实验报告

数据结构栈和队列实验报告实验报告:数据结构栈和队列一、实验目的1.了解栈和队列的基本概念和特点;2.掌握栈和队列的基本操作;3.掌握使用栈和队列解决实际问题的方法。

二、实验内容1.栈的基本操作实现;2.队列的基本操作实现;3.使用栈和队列解决实际问题。

三、实验原理1.栈的定义和特点:栈是一种具有后进先出(LIFO)特性的线性数据结构,不同于线性表,栈只能在表尾进行插入和删除操作,称为入栈和出栈操作。

2.队列的定义和特点:队列是一种具有先进先出(FIFO)特性的线性数据结构,不同于线性表,队列在表头删除元素,在表尾插入元素,称为出队和入队操作。

3.栈的基本操作:a.初始化:建立一个空栈;b.入栈:将元素插入栈的表尾;c.出栈:删除栈表尾的元素,并返回该元素;d.取栈顶元素:返回栈表尾的元素,不删除。

4.队列的基本操作:a.初始化:建立一个空队列;b.入队:将元素插入队列的表尾;c.出队:删除队列表头的元素,并返回该元素;d.取队头元素:返回队列表头的元素,不删除。

四、实验步骤1.栈的实现:a.使用数组定义栈,设置栈的大小和栈顶指针;b.实现栈的初始化、入栈、出栈和取栈顶元素等操作。

2.队列的实现:a.使用数组定义队列,设置队列的大小、队头和队尾指针;b.实现队列的初始化、入队、出队和取队头元素等操作。

3.使用栈解决实际问题:a.以括号匹配问题为例,判断一个表达式中的括号是否匹配;b.使用栈来实现括号匹配,遍历表达式中的每个字符,遇到左括号入栈,遇到右括号时将栈顶元素出栈,并判断左右括号是否匹配。

4.使用队列解决实际问题:a.以模拟银行排队问题为例,实现一个简单的银行排队系统;b.使用队列来模拟银行排队过程,顾客到达银行时入队,处理完业务后出队,每个顾客的业务处理时间可以随机确定。

五、实验结果与分析1.栈和队列的基本操作实现:a.栈和队列的初始化、入栈/队、出栈/队以及取栈顶/队头元素等操作均能正常运行;b.栈和队列的时间复杂度均为O(1),操作效率很高。

数据结构栈与队列的实验报告

数据结构栈与队列的实验报告

数据结构栈与队列的实验报告实验概述本次实验的目的是通过对栈和队列进行实现和应用,加深对数据结构中的栈和队列的理解和巩固操作技能。

栈和队列作为常见的数据结构在程序开发中得到了广泛的应用,本次实验通过 C++ 语言编写程序,实现了栈和队列的基本操作,并对两种数据结构进行了应用。

实验内容1. 栈的实现栈是一种先进后出的数据结构,具有后进先出的特点。

通过使用数组来实现栈,实现入栈、出栈、输出栈顶元素和清空栈等操作。

对于入栈操作,将元素插入到数组的栈顶位置;对于出栈操作,先将数组的栈顶元素弹出,再使其下移,即将后面的元素全部向上移动一个位置;输出栈顶元素则直接输出数组的栈顶元素;清空栈则将栈中所有元素全部清除即可。

3. 栈和队列的应用利用栈和队列实现八皇后问题的求解。

八皇后问题,是指在8×8 的国际象棋盘上放置八个皇后,使得任意两个皇后都不能在同一行、同一列或者同一对角线上。

通过使用栈来保存当前八皇后的位置,逐个放置皇后并检查是否有冲突。

如果当前位置符合要求,则将位置保存到栈中,并继续查询下一个皇后的位置。

通过使用队列来进行八数码问题的求解。

八数码问题,是指在3×3 的矩阵中给出 1 至 8 的数字和一个空格,通过移动数字,最终将其变为 1 2 3 4 5 6 7 8 空的排列。

通过使用队列,从初始状态出发,枚举每种情况,利用队列进行广度遍历,逐一枚举状态转移,找到对应的状态后进行更新,周而复始直到找到正确的答案。

实验结果通过使用 C++ 语言编写程序,实现了栈和队列的基本操作,并对八皇后和八数码问题进行了求解。

程序执行结果如下:栈和队列实现的基本操作都能够正常进行,并且运行效率较高。

栈和队列的实现方便了程序编写并加速了程序运行。

2. 八皇后问题的求解通过使用栈来求解八皇后问题,可以得到一组成立的解集。

图中展示了求解某一种八皇后问题的过程。

从左到右是棋盘的列数,从上到下是棋盘的行数,通过栈的操作,求出了在棋盘上符合不同要求(不在同一行、同一列和斜线上)的八皇后位置。

数据结构栈和队列实验报告

数据结构栈和队列实验报告

数据结构栈和队列实验报告数据结构栈和队列实验报告1.实验目的本实验旨在通过设计栈和队列的数据结构,加深对栈和队列的理解,并通过实际操作进一步掌握它们的基本操作及应用。

2.实验内容2.1 栈的实现在本实验中,我们将使用数组和链表两种方式实现栈。

我们将分别实现栈的初始化、入栈、出栈、判断栈是否为空以及获取栈顶元素等基本操作。

通过对这些操作的实现,我们可将其用于解决实际问题中。

2.2 队列的实现同样地,我们将使用数组和链表两种方式实现队列。

我们将实现队列的初始化、入队、出队、判断队列是否为空以及获取队头元素等基本操作。

通过对这些操作的实现,我们可进一步了解队列的特性,并掌握队列在实际问题中的应用。

3.实验步骤3.1 栈的实现步骤3.1.1 数组实现栈(详细介绍数组实现栈的具体步骤)3.1.2 链表实现栈(详细介绍链表实现栈的具体步骤)3.2 队列的实现步骤3.2.1 数组实现队列(详细介绍数组实现队列的具体步骤)3.2.2 链表实现队列(详细介绍链表实现队列的具体步骤)4.实验结果与分析4.1 栈实验结果分析(分析使用数组和链表实现栈的优缺点,以及实际应用场景)4.2 队列实验结果分析(分析使用数组和链表实现队列的优缺点,以及实际应用场景)5.实验总结通过本次实验,我们深入了解了栈和队列这两种基本的数据结构,并利用它们解决了一些实际问题。

我们通过对数组和链表两种方式的实现,进一步加深了对栈和队列的理解。

通过实验的操作过程,我们也学会了如何设计和实现基本的数据结构,这对我们在日后的学习和工作中都具有重要意义。

6.附件6.1 源代码(附上栈和队列的实现代码)6.2 实验报告相关数据(附上实验过程中所产生的数据)7.法律名词及注释7.1 栈栈指的是一种存储数据的线性数据结构,具有后进先出(LIFO)的特点。

栈的操作主要包括入栈和出栈。

7.2 队列队列指的是一种存储数据的线性数据结构,具有先进先出(FIFO)的特点。

数据结构栈和队列实验报告

数据结构栈和队列实验报告
2输入自己编好的程序。
3检查一遍已输入的程序是否有错〔包括输入时输错的和编程中的错误〕,如发现有错,及时改正。
4进展编译和连接。如果在编译和连接过程中发现错误,频幕上会出现"报错信息〞,根据提示找到出错位置和原因,加以改正。再进展编译,如此反复直到不出错为止。
5运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果是否正确,应运行屡次,分别检查在不同情况下结果是否正确。
s->ne*t=NULL;
}
void DestroyStack(LiStack *&s)//销毁栈
{LiStack *p=s,*q=s->ne*t;
while (q!=NULL)
{free(p);
p=q;
q=p->ne*t;
}
free(p);//此时p指向尾节点,释放其空间
}
bool StackEmpty(LiStack *s)//判断栈是否为空
printf("栈s的根本运算如下:\n");
printf(" (1)初始化栈s\n");
InitStack(s);
printf(" (2)栈为%s\n",(StackEmpty(s)""空":"非空"));
printf(" (3)依次进栈元素a,b,c,d,e\n");
Push(s,'a');Байду номын сангаас
Push(s,'b');
#include <stdio.h>
#include <malloc.h>
#define Ma*Size 100

数据结构实验报告之栈和队列

数据结构实验报告之栈和队列

数据结构实验报告之栈和队列1. 编写程序实现顺序栈的各种基本运算:初始化、销毁、清空、判断是否为空栈、求栈的长度、取栈顶元素、进栈、出栈。

在此基础上设计⼀个主程序完成如下功能:(1)初始化栈s;(2)判断栈s是否为空;(3)依次进栈元素a,b,c,d;(4)判断栈s是否为空;(5)输出栈s的长度;(6)栈⾥元素依次出栈,并输出;(7)销毁栈s。

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef char SElemType;#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量typedef struct {SElemType *base; //栈底指针SElemType *top; //栈顶指针int stacksize; //当前已分配的存储空间} SqStack;Status InitStack(SqStack &S) { //构造⼀个空栈SS.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (!S.base) exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}//InitStackStatus StackLength(SqStack S) {return S.top - S.base;}//StackLengthStatus DestoryStack(SqStack &S) {S.top = S.base;free(S.base);//若base的值为NULL,则表明栈结构不存在S.base = NULL;S.top = NULL;S.stacksize = 0;return OK;}Status StackEmpty(SqStack S) {if (S.top == S.base)return1;elsereturn0;}//StackEmptyStatus GetTop(SqStack S, SElemType &e) {if (S.top == S.base) return ERROR;e = *(S.top - 1);return OK;}//GetTopStatus Push(SqStack &S, SElemType e) {if (S.top - S.base >= S.stacksize) {S.base = (SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType));if (!S.base)exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize+= STACKINCREMENT;}*S.top++=e;return OK;}//PushStatus Pop(SqStack &S, SElemType &e) {//判断栈是否为空if (S.base == S.top)return ERROR;e = *(S.top - 1);S.top--;return OK;}//Popvoid main(){SqStack s;SElemType e;printf("(1)初始化栈\n");InitStack(s);printf("(2)The stack is ");if (StackEmpty(s))printf("empty.\n");elseprintf("not empty.\n");printf("(3)依次进栈元素a,b,c,d\n");Push(s, 'a');Push(s, 'b');Push(s, 'c');Push(s, 'd');printf("(4)The stack is ");if (StackEmpty(s))printf("empty.\n");elseprintf("not empty.\n");printf("(5)The length of the stack is %d\n", StackLength(s));printf("(6)The stack is ");while (!StackEmpty(s)){Pop(s, e);printf("%c \n", e);}printf("(7)销毁栈s");DestoryStack(s);}运⾏结果:2. 编写程序实现链队列的各种基本运算:初始化、销毁、清空、判断是否为空队列、求队列的长度、取队列的头元素、⼊队、出队。

栈-队列的顺序-链式储存结构(数据结构试验报告)

栈-队列的顺序-链式储存结构(数据结构试验报告)

数据结构实验报告班级:计学号:姓名:设计日期:西安计算机学院实验题目1)栈的顺序存储结构2)栈的链式存储结构3)队列的链式存储结构4)队列的循环存储结构2.需求分析本演示程序用C语言编写,完成栈和列的初始化,入栈、出栈、输出操作。

1)对于顺序栈,入栈时要先判断栈是否满了,栈满不能入栈,否则出现空间溢出;在进栈出栈和读取栈顶时先判栈是否为空,为空时不能操作。

2)在一个链队表中需设定两个指针分别指向队列的头和尾。

3)队列的存储结构:注意要判断队满和队空。

4)程序所能达到的功能:完成栈的初始化,入栈,出栈和输出操作;完成队列的初始化,入队列,出队列和输出操作。

3.概要设计本程序包含1、栈的顺序存储结构包含的函数:1)主函数main()2)入栈函数Push()3)出栈函数Pop()2、栈的链式存储结构包含的函数:1)主函数main()2)入栈函数PushStack()3)退栈函数PopStack()4)取栈顶元素函数Getstack top()3、队列的链式存储结构所包含的函数:1)主函数main()2)入队函数EnQueue()3)出队函数DeQueue()4 队列的循环所包含的函数:1)主函数main()2)初始化循环函数CircSeqQueue()3)入队函数EnQueue()4)出队函数DeQueue()5)取队首元素函数GetFront()4.详细设计1)栈的顺序存储结构#include<stdio.h>#include<stdlib.h>#include<conio.h>#define MAXSIZE 20typedef int datatype;typedef struct{ datatype elem[MAXSIZE];int top;}SeqStack;int init(SeqStack *s){ s->top=-1; return 1;}void print(SeqStack *s){char ch; int i;if(s->top==-1)printf("\n 栈已空.");else{i=s->top;while(i!=-1){printf("\n data=%d",s->elem[i]); i--;}}printf("\n 按回车继续");ch=getch();}void push(SeqStack *s,datatype x){if(s->top==MAXSIZE-1) printf("\n 栈已满!");else s->elem[++s->top]=x;}datatype pop(SeqStack*s){datatype x;if(s->top==-1){printf("\n 栈已空! "); x=-1;}else{x=s->elem[s->top--];}return(x);}void main(){SeqStack s; int k; datatype x;if(init(&s)){do {printf("\n\n\n");printf("\n***************************************");printf("\n\n 1. x进栈");printf("\n\n 2.出栈返回其值");printf("\n\n 3 结束");printf("\n***************************************");printf("\n 请选择(123)");scanf("%d",&k);switch(k){case 1:{printf("\n 请输入进栈整数X=?");scanf("%d",&x);push(&s,x);print(&s);}break;case 2:{ x=pop(&s);printf("\n 出栈元素:%d",x);print(&s);}break;case 3:exit(0);}printf("n---------");}while(k>=1 &&k<3);printf("\n 按回车返回");getch();}elseprintf("\n 初始化失败!\n");}2).栈的链式存储结构#include<stdio.h>#include<stdlib.h>typedef struct SNode{int data;struct SNode*next;}SNode,*LinkStack;LinkStack top;LinkStack PushStack(LinkStack top,int x)//入栈{LinkStack s;s=(LinkStack)malloc(sizeof(SNode));s->data=x;s->next=top;top=s;return top;}LinkStack PopStack(LinkStack top) //退栈{LinkStack p;if(top!=NULL){p=top;top=top->next;free(p);printf("退栈已完成\n");return top;}elseprintf("栈是空的,无法退栈!\n");return 0;}int GetStackTop(LinkStack top) //取栈顶元素{return top->data;}bool IsEmpty(){return top==NULL?true:false;}void Print(){SNode*p;p=top;if(IsEmpty()){printf("The stack is empty!\n");return;}while(p){printf("%d ",p->data);p=p->next;}printf("\n");}void main(){int x,a,b;char m;do{printf("\n");printf(" 链栈的基本操作\n");printf(" \n");printf(" 1.置空栈\n");printf(" 2.进栈\n");printf(" 3.退栈\n");printf(" 4.取栈顶元素\n");printf(" 5.退出程序\n");printf("\n 请选择一个数字(1 2 3 4 5):");scanf("%c",&m);switch(m){case '1':{top=NULL;printf("\n栈已置空!");break;}case '2':{printf("请输入要进栈的元素个数是:");scanf("%d",&a);printf("\n请输入要进栈的%d个元素:",a);for(b=0;b<a;b++){scanf("%d",&x);top=PushStack(top,x);}printf("进栈已完成!\n");printf("\n输出栈为:");Print();}break;case '3':{printf("\n操作之前的输出栈为:");Print();top=PopStack(top);printf("\n操作过后的输出栈为:");Print();}break;case '4':{printf("\n输出栈为:");Print();if(top!=NULL)printf("\n栈顶元素是:%d\n",GetStackTop(top));elseprintf("\n栈是空的,没有元素!");}break;case '5':break;default:printf("\n输入的字符不对,请重新输入!");break;}getchar();}while(m!='5'); }运算结果:3)队列的链式存储结构#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<stdio.h>#include<stdlib.h>#include<math.h>typedef int dataType;typedef struct node{ dataType data;struct node *next;}QNode;typedef struct{QNode *front,*rear;}LQueue;/*初始化*/int init(LQueue *q){if((q->front=(QNode *)malloc(sizeof(QNode)))==NULL) return 0;q->rear=q->front;q->front->next=NULL;return 1;}/*出队*/void print(LQueue Q){ QNode *p; char ch;p=Q.front->next;while(p!=NULL){printf("\n%d",p->data); p=p->next; } printf("\n 按回车键继续。

数据结构实验报告 栈和队列

数据结构实验报告 栈和队列

数据结构实验报告栈和队列
栈(Stack)和队列(Queue)都是常用的数据结构。

它们都是有限的数据存储结构,主要用于记录数据的存储和检索。

它们具有许多相同的特征,可以根据每一个实例的需要而定制遍历,并可以使用相同的存储方法。

但是,从数据操作和操作数据的角度来看,它们仍有差异。

首先,栈和队列的数据操作模式不同。

栈是遵循“先进后出”(LIFO)的原则,只有最后一个元素可以被弹出或者取出;而队列则是遵循“先进先出”(FIFO)的原则,第一个元素是最先被取出或弹出的。

此外,栈不允许插入新元素,而队列允许任何位置插入和删除元素。

此外,栈只能被依次访问,而队列允许改变已有元素的位置。

此外,栈和队列可以用相似的实现方式来构建。

一般来说,它们都使用 .链表,数组或者树来存储数据,并使用相同的Pointers来指向数据结构中的元素。

栈和队列也可以使用交换的方式来改变其存储方式,从而提高其效率。

对于实际应用来说,栈和队列都有自己的优势,具体取决于应用中的需求。

比如,栈通常被用于数据的深度优先遍历,而队列则可以用于数据的广度优先遍历。

此外,栈也可以用于处理函数调用,而队列可以用于处理操作系统任务或者打印池中的任务等。

数据结构实验-线性表及其实现栈和队列及其应用

数据结构实验-线性表及其实现栈和队列及其应用

数据结构实验报告一实验名称:线性表及其实现栈和队列及其应用1 实验目的及实验要求1.线性表目的要求:(1)熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现,以线性表的各种操作(建立、插入、删除等)的实现为实验重点;(2)通过本次实验帮助学生加深对顺序表、链表的理解,并加以应用;(3)掌握循环链表和双链表的定义和构造方法2.栈和队列目的要求:(1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们;(2)本实验训练的要点是“栈”的观点及其典型用法;(3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。

2实验内容及实验步骤(附运行结果截屏)1.线性表实验内容:(1)编程实现线性表两种存储结构(顺序存储、链式存储)中的基本操作的实现(线性表的创建、插入、删除和查找等),并设计一个菜单调用线性表的基本操作。

(2)建立一个按元素递增有序的单链表L,并编写程序实现:a)将x插入其中后仍保持L的有序性;b)将数据值介于min和max之间的结点删除,并保持L的有序性;c)(选做)将单链表L逆置并输出;(3)编程实现将两个按元素递增有序的单链表合并为一个新的按元素递增的单链表。

注:(1)为必做题,(2)~(3)选做。

2.栈和队列实验内容:(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);(2)应用栈的基本操作,实现数制转换(任意进制);(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);(4)利用栈实现任一个表达式中的语法检查(括号的匹配)。

(5)利用栈实现表达式的求值。

注:(1)~(2)必做,(3)~(5)选做。

实验步骤:先编写线性表和栈和队列的类模板,实现各自的基础结构,之后按照要求编写适当的函数方法(公共接口),最后完成封装。

编写主函数直接调用即可。

核心代码://LinearList.h 顺序表//类的声明1.template<class T>2.class LinearList3.{4.public:5.LinearList(int sz = default_size);6.~LinearList();7.int Length()const; //length of the linear8.int Search(T x)const; //search x in the linear and return its order number9.T GetData(int i)const; //get i th order's data10.bool SetData(int i,T x); //change i th order's data to x11.bool DeleteData(int i);12.bool InsertData(int i,T x);13.void output(bool a,int b,int c); //print the linear14.void ReSize(int new_size);15.16.private:17.T *data;18.int max_size,last_data;19.};//构造函数1.template<class T>2.LinearList<T>::LinearList(int sz)3.{4.if(sz>0)5.{6.max_size = sz;st_data=-1;8.data=new T[max_size];9.if(data == NULL)10.{11.cerr<<"Memory creat error!"<<endl;12.exit(1);13.}14.}15.else16.{17.cerr<<"Size error!"<<endl;18.exit(1);19.}20.}//Qlist.h 链式表//模板类的声明1.template<class T>2.struct LinkNode3.{4.T data;5.LinkNode<T> *link;6.LinkNode(LinkNode<T> *ptr = NULL)7.{8.link = ptr;9.}10.LinkNode(const T item,LinkNode<T> *ptr = NULL)11.{12.data = item;13.link = ptr;14.}15.};16.17.template<class T>18.class Qlist: public LinkNode<T>19.{20.public:21.Qlist();22.Qlist(const T x);23.Qlist(Qlist<T>&L);24.~Qlist();25.void MakeEmpty();26.int Length()const; //length of the linear27.int Search(T x)const; //search x in the linear and return its order number28.LinkNode<T> *Locate(int i);29.T GetData(int i); //get i th order's data30.bool SetData(int i,T x); //change i th order's data to x31.bool DeleteData(int i);32.bool InsertData(int i,T x);33.void output(bool a,int b,int c); //print the linear34.35.protected:36.LinkNode<T> *first;37.};//构造函数1.template<class T>2.Qlist<T>::Qlist(Qlist<T>&L)3.{4.T value;5.LinkNode<T>*src = L.getHead();6.LinkNode<T>*des = first = new LinkNode<T>;7.while(src->link != NULL)8.{9.value = src->link->data;10.des->link = new LinkNode<T>(value);11.des = des->link;12.src = src->link;13.}14.des->link = NULL;15.}截屏:3 实验体会(实验遇到的问题及解决方法)刚开始的时候本想先写线性表的类模板然后分别进行继承写顺序表和链式表甚至是以后的栈和队列。

栈和队列实验报告

栈和队列实验报告

栈和队列实验报告实验名称:栈和队列的实验研究摘要:本实验旨在通过设计并实现基于栈和队列的算法,探索其在数据结构和算法中的应用。

通过实验比较栈和队列的性能差异和适用场景,加深对栈和队列的理解和应用。

实验结果表明,栈和队列在不同的问题场景中具有不同的优势和适用性。

关键词:栈、队列、数据结构、算法、应用一、引言栈和队列是数据结构中常见且重要的两种数据结构,它们分别以LIFO(Last In First Out,后进先出)和FIFO(First In First Out,先进先出)的方式操作数据,广泛应用于各领域的编程和算法设计中。

本实验通过实现栈和队列相关操作的算法,探索它们在实际应用中的效率和优势。

二、实验设计与实现1.实验设计本实验采用C++语言来实现栈和队列的操作,并编写相应的算法来解决一些典型问题。

实验将比较栈和队列在以下几个方面的性能差异:a)插入操作的性能b)删除操作的性能c)查询操作的性能d)栈和队列的空间占用情况2.实验步骤a)设计栈的数据结构和相关操作的算法。

b)设计队列的数据结构和相关操作的算法。

c)分别使用栈和队列来解决一个典型问题,并比较它们的效率。

d)分析实验结果,总结栈和队列的适用场景和优势。

三、实验结果与分析1.栈的性能比较在本次实验中,我们使用栈来解决斐波那契数列问题。

首先,我们设计了一个栈的数据结构,并实现了如下操作:a) 入栈(push):将元素添加到栈顶。

b) 出栈(pop):将栈顶元素移出栈。

c) 查询栈顶元素(top):返回栈顶元素。

对比使用数组和链表实现栈的性能,我们发现使用链表实现的栈在插入和删除操作上有更好的性能表现,而使用数组实现的栈在查询操作上更高效。

这是因为使用链表实现的栈不需要移动大量元素,而使用数组实现的栈可以通过索引直接访问任意位置的元素。

2.队列的性能比较在本次实验中,我们使用队列来解决击鼓传花问题。

首先,我们设计了一个队列的数据结构,并实现了如下操作:a) 入队(enqueue):将元素添加到队列末尾。

数据结构栈和队列实验报告

数据结构栈和队列实验报告

数据结构栈和队列实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的栈和队列的基本概念、操作原理以及实际应用。

通过编程实现栈和队列的相关操作,加深对其特性的认识,并能够运用栈和队列解决实际问题。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

三、实验原理(一)栈栈(Stack)是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out,LIFO)的原则。

可以将栈想象成一个只有一端开口的容器,元素只能从开口端进出。

入栈操作(Push)将元素添加到栈顶,出栈操作(Pop)则从栈顶移除元素。

(二)队列队列(Queue)也是一种线性表,但其操作遵循“先进先出”(FirstIn First Out,FIFO)的原则。

队列就像是排队买票的队伍,先到的人先接受服务。

入队操作(Enqueue)将元素添加到队列的末尾,出队操作(Dequeue)则从队列的头部移除元素。

四、实验内容(一)栈的实现与操作1、定义一个栈的数据结构,包含栈顶指针、存储元素的数组以及栈的最大容量等成员变量。

2、实现入栈(Push)操作,当栈未满时,将元素添加到栈顶,并更新栈顶指针。

3、实现出栈(Pop)操作,当栈不为空时,取出栈顶元素,并更新栈顶指针。

4、实现获取栈顶元素(Top)操作,返回栈顶元素但不进行出栈操作。

5、实现判断栈是否为空(IsEmpty)和判断栈是否已满(IsFull)的操作。

(二)队列的实现与操作1、定义一个队列的数据结构,包含队头指针、队尾指针、存储元素的数组以及队列的最大容量等成员变量。

2、实现入队(Enqueue)操作,当队列未满时,将元素添加到队尾,并更新队尾指针。

3、实现出队(Dequeue)操作,当队列不为空时,取出队头元素,并更新队头指针。

4、实现获取队头元素(Front)操作,返回队头元素但不进行出队操作。

5、实现判断队列是否为空(IsEmpty)和判断队列是否已满(IsFull)的操作。

数据结构栈和队列实验报告

数据结构栈和队列实验报告

数据结构栈和队列实验报告数据结构栈和队列实验报告1.引言本实验旨在通过设计和实现栈和队列的数据结构,掌握栈和队列的基本操作,并进一步加深对数据结构的理解和应用。

2.实验目的本实验的主要目标包括:________●掌握栈和队列的数据结构实现。

●熟悉栈和队列的基本操作:________入栈、出栈、入队、出队。

●理解栈和队列的应用场景,并能够灵活运用。

3.实验原理3.1 栈栈是一种特殊的数据结构,它采用“后进先出”的方式对元素进行操作。

栈的主要操作包括入栈和出栈,入栈将元素压入栈顶,出栈将栈顶元素弹出。

3.2 队列队列也是一种特殊的数据结构,它采用“先进先出”的方式对元素进行操作。

队列的主要操作包括入队和出队,入队将元素放入队列尾部,出队将队列头部的元素移除。

4.实验过程4.1 栈的实现a. 定义栈的数据结构在实现栈之前,首先要定义栈的数据结构,包括数据存储结构和相关操作方法。

b. 定义入栈操作入栈操作将元素压入栈顶。

c. 定义出栈操作出栈操作将栈顶元素弹出。

4.2 队列的实现a. 定义队列的数据结构在实现队列之前,首先要定义队列的数据结构,包括数据存储结构和相关操作方法。

b. 定义入队操作入队操作将元素放入队列尾部。

c. 定义出队操作出队操作将队列头部的元素移除。

5.实验结果与分析将栈和队列的数据结构实现后,可以进行测试和验证。

通过将不同类型的元素入栈和入队,然后再进行出栈和出队操作,最后检查栈和队列的状态,验证其正确性。

6.实验总结本实验通过设计和实现栈和队列的数据结构,掌握了栈和队列的基本操作。

并通过对栈和队列的应用,加深了对数据结构的理解和应用。

附件:________无法律名词及注释:________无。

栈和队列实验报告

栈和队列实验报告

栈和队列实验报告引言:计算机科学中的数据结构是解决问题的关键。

栈和队列这两种常用的数据结构,无疑在许多实际应用中起着重要的作用。

本篇报告旨在探讨栈和队列的实验结果,并展示它们的实际应用。

一、栈的实验结果及应用1. 栈的实验结果在实验中,我们设计了一个基于栈的简单计算器,用于实现基本的四则运算。

通过栈的先进后出(Last In First Out)特性,我们成功实现了表达式的逆波兰表示法,并进行了正确的计算。

实验结果表明,栈作为一个非常有效的数据结构,可以很好地处理栈内数据的存储和检索。

2. 栈的应用栈在计算机科学中有许多实际应用。

其中之一是程序调用的存储方式。

在程序调用过程中,每个函数的返回地址都可以通过栈来保存和恢复。

另一个应用是浏览器的历史记录。

浏览器中每个访问网页的URL都可以通过栈来存储,以便用户能够追溯他们之前访问的网页。

二、队列的实验结果及应用1. 队列的实验结果在实验中,我们模拟了一个简单的出租车调度系统,利用队列的先进先出(First In First Out)特性实现乘客的排队和叫车。

实验结果表明,队列作为一个具有高效性和可靠性的数据结构,能够很好地处理排队问题。

2. 队列的应用队列在许多方面都有应用。

一个常见的应用是消息队列。

在网络通信中,消息队列可以用于存储和传递信息,确保按照特定的顺序进行处理。

另一个应用是操作系统的进程调度。

操作系统使用队列来管理各个进程的执行顺序,以实现公平和高效的资源分配。

三、栈和队列的比较及选择1. 效率比较栈和队列在实际应用中的效率取决于具体问题的需求。

栈的操作更简单,仅涉及栈顶元素的插入和删除,因此具有更高的执行速度。

而队列涉及到队头和队尾元素的操作,稍复杂一些。

但是,队列在某些问题中的应用更为广泛,例如调度问题和消息传递问题。

2. 如何选择在选择栈和队列时,需要根据实际问题的性质和需求进行综合考虑。

如果问题需要追溯历史记录或按照特定顺序进行处理,则应选择栈作为数据结构。

数据结构栈和队列实验报告

数据结构栈和队列实验报告

数据结构栈和队列实验报告实验目的:掌握数据结构栈和队列的基本概念和操作,通过实验加深对栈和队列的理解。

1.实验原理1.1 栈的原理栈是一种具有后进先出(LIFO)特点的数据结构。

在栈中,只允许在栈顶进行插入、删除和访问操作,并且这些操作仅限于栈顶元素。

1.2 队列的原理队列是一种具有先进先出(FIFO)特点的数据结构。

在队列中,元素的插入操作只能在队列的一端进行,称为队尾。

而元素的删除操作只能在队列的另一端进行,称为队头。

2.实验要求2.1 实现栈和队列的基本操作●栈的基本操作:压栈、弹栈、获取栈顶元素和判断栈是否为空。

●队列的基本操作:入队、出队、获取队头元素和判断队列是否为空。

2.2 进行相应操作的测试●对栈进行插入、删除、访问等操作的测试,并输出测试结果。

●对队列进行插入、删除、访问等操作的测试,并输出测试结果。

3.实验环境●操作系统:Windows 10●开发工具:C++编译器4.实验步骤4.1 栈的实现步骤1:定义栈的结构体,包含栈的容量和栈顶指针。

步骤2:根据栈的容量动态分配内存。

步骤3:实现栈的基本操作函数:压栈、弹栈、获取栈顶元素和判断栈是否为空。

步骤4:进行栈的相关测试。

4.2 队列的实现步骤1:定义队列的结构体,包含队列的容量、队头和队尾指针。

步骤2:根据队列的容量动态分配内存。

步骤3:实现队列的基本操作函数:入队、出队、获取队头元素和判断队列是否为空。

步骤4:进行队列的相关测试。

5.实验结果与分析5.1 栈的测试结果●压栈操作测试:将若干元素压入栈中。

●弹栈操作测试:依次弹出栈中的元素。

●获取栈顶元素测试:输出栈顶元素。

●判断栈是否为空测试:输出栈是否为空的结果。

5.2 队列的测试结果●入队操作测试:将若干元素入队。

●出队操作测试:依次出队元素。

●获取队头元素测试:输出队头元素。

●判断队列是否为空测试:输出队列是否为空的结果。

6.结论通过本次实验,我们掌握了栈和队列的基本概念和操作。

栈和队列实验报告

栈和队列实验报告

数据结构实验报告顺序栈的实现和基本操作一、需求分析(1)顺序栈◆栈的典型操作是入栈和出栈,前者将新元素压入栈中,后者弹出栈顶元素。

栈只提供对栈顶元素的访问操作,由top ( )完成。

Push ( )和Pop ( )还有Top ( )共同构成了栈的最小功能接口。

此外,为了方便使用,栈还有判空,判满和输出栈等功能。

◆输入形式及范围:输入形式为整型,范围为0~65535。

◆输出形式:在顺序栈的初始化后显示初始化成功,在判断栈是否为空时显示当前栈为空,入栈后显示入栈成功或者栈已满。

出栈时显示出栈元素或者栈为空。

输出栈时依次显示栈中元素。

◆程序功能:初始化栈,判断栈是否为空,判断栈是否为满,入栈,出栈,取栈顶元素,出栈同时返回栈顶元素和输出栈等功能。

◆测试数据:初始化后输入栈的长度为4。

判断栈是否为空。

进行5次入栈操作。

分别输入1 2 3 4 5输出栈。

执行2次出栈操作。

输出栈。

查看栈顶元素。

输出栈。

(2)队列◆队列的典型操作是入队和出队,前者将新元素压入队列中,后者弹出队首头元素。

队列只提供对队头元素和队尾元素的操作,由DeQueue ( ) 和EnQueue( )完成。

DeQueue还有EnQueue ( )共同构成了队列的最小功能接口。

此外,为了方便使用,队列还有判空,判满和输出队列等功能。

◆输入形式及范围:输入形式为整型,范围为0~65535。

◆输出形式:在顺序队列的初始化后显示初始化成功,在判断队列是否为空时显示当前队列为空,入队列后显示入队成功或者队列已满。

出队列时显示出队首元素或者队列为空。

输出队列时依次显示队列中元素。

◆程序功能:初始化队列,判断队列是否为空,判断队列是否为满,入队,出队,取队首元素,输出队列等功能。

◆测试数据:初始化后输入队列的长度为54。

判断队列是否为空。

进行5次入队操作。

分别输入1 2 3 4 5输出队列。

执行2次出队操作。

输出队列。

查看队首元素。

输出队列。

二、概要设计(1)顺序栈◆为了实现程序的功能,在.H文件中定义了栈的模板类. template <class T>class Stack{私有数据成员:private:栈的最大长度int MaxSize;栈顶位置int top;顺序栈首地址T *theArray;公有成员:public:栈的初始化void InitStack(int capacity=10);操作结果:初始化一个默认长度为10的空栈判断栈是否为空bool IsEmpty() const;初始条件:栈已存在。

数据结构栈和队列实验报告简版

数据结构栈和队列实验报告简版

数据结构栈和队列实验报告数据结构栈和队列实验报告1. 实验目的本实验的主要目的是通过实践的方式理解并掌握数据结构中栈和队列的概念、特点和基本操作。

通过实验,我们可以加深对栈和队列的理解,掌握栈和队列的应用方法,并能够设计和实现基于栈和队列的算法。

2. 实验内容本实验分为两个部分:栈的应用和队列的应用。

2.1 栈的应用栈是一种具有特定限制的线性表,它只允许在表的一端进行插入和删除操作,该端被称为栈顶。

栈的特点是“后进先出”(Last In First Out, LIFO),即最后进栈的元素最先出栈。

在本实验中,我们将实现一个简单的栈类,并应用栈来解决一个问题。

假设有一个字符串,其中包含了括号(圆括号、方括号和花括号),我们需要判断该字符串中的括号是否匹配。

为了达到这个目的,我们可以使用栈来辅助实现。

在实现过程中,我们可以定义一个栈来存储左括号,然后依次遍历字符串的每个字符。

当遇到左括号时,将其入栈;当遇到右括号时,判断栈顶是否是对应的左括号,如果是,则将栈顶元素出栈,否则说明括号不匹配。

最后,当栈为空时,表明所有的括号都匹配,否则说明括号不匹配。

2.2 队列的应用队列是一种具有特定限制的线性表,它只允许在表的一端进行插入操作(队尾),在表的另一端进行删除操作(队头)。

队列的特点是“先进先出”(First In First Out, FIFO),即最早进队列的元素最先出队列。

在本实验中,我们将实现一个简单的队列类,并应用队列来解决一个问题。

假设有一群人在排队等候,我们需要按照一定规则进行排队并输出结果。

为了达到这个目的,我们可以使用队列来进行模拟。

在实现过程中,我们可以定义一个队列来存储等候的人,然后依次将人入队列。

当需要输出结果时,我们可以通过队列的出队列操作,按照先后顺序依次输出到达队头的人。

通过使用队列,我们可以模拟人们排队等候的实际情况,并能够按照一定规则输出结果。

3. 实验过程本实验的实验过程如下:1. 首先,我们需要实现一个栈类。

数据结构栈和队列实验报告

数据结构栈和队列实验报告

数据结构栈和队列实验报告数据结构栈和队列实验报告引言:数据结构是计算机科学中非常重要的一个概念,它用于组织和存储数据,以便于程序的运行和管理。

栈和队列是数据结构中最基本的两种形式之一,它们在实际应用中有着广泛的应用。

本实验旨在通过实际操作和观察,深入理解栈和队列的特性和应用。

一、实验目的:1. 了解栈和队列的基本概念和特性;2. 掌握栈和队列的基本操作;3. 理解栈和队列在实际应用中的作用。

二、实验过程:本次实验我们使用Python语言来实现栈和队列的操作。

首先,我们定义了栈和队列的类,并编写了相应的操作方法。

1. 栈的实现:栈是一种后进先出(LIFO)的数据结构,类似于我们日常生活中的弹簧簿记本。

我们首先定义了一个栈类,其中包括了栈的初始化、入栈、出栈、获取栈顶元素等方法。

通过这些方法,我们可以对栈进行各种操作。

2. 队列的实现:队列是一种先进先出(FIFO)的数据结构,类似于我们日常生活中的排队。

我们同样定义了一个队列类,其中包括了队列的初始化、入队、出队、获取队首元素等方法。

通过这些方法,我们可以对队列进行各种操作。

三、实验结果:我们通过实验,成功实现了栈和队列的基本操作。

在测试过程中,我们发现栈和队列在实际应用中有着广泛的用途。

1. 栈的应用:栈在计算机系统中有着重要的作用,例如在函数调用中,每次函数调用时都会将返回地址和局部变量等信息存储在栈中,以便于函数执行完毕后能够正确返回。

此外,栈还可以用于表达式求值、括号匹配等场景。

2. 队列的应用:队列在操作系统中常用于进程调度,通过维护一个就绪队列,操作系统可以按照一定的策略选择下一个要执行的进程。

此外,队列还可以用于消息传递、缓冲区管理等场景。

四、实验总结:通过本次实验,我们深入了解了栈和队列的特性和应用。

栈和队列作为数据结构中最基本的两种形式,它们在计算机科学中有着广泛的应用。

在实际编程中,我们可以根据具体的需求选择合适的数据结构,以提高程序的效率和可读性。

数据结构-堆栈和队列实验报告

数据结构-堆栈和队列实验报告

数据结构-堆栈和队列实验报告数据结构堆栈和队列实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的堆栈和队列的基本概念、操作原理以及实际应用。

通过实际编程实现堆栈和队列的相关操作,加深对其特性的认识,提高编程能力和解决问题的能力。

二、实验环境本次实验使用的编程语言为 Python,开发工具为 PyCharm。

三、实验原理(一)堆栈(Stack)堆栈是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out,LIFO)的原则。

可以将堆栈想象成一个只能从一端进行操作的容器,新元素总是被添加到这一端(称为栈顶),而取出元素也只能从栈顶进行。

堆栈的基本操作包括:1、`push`:将元素压入堆栈。

2、`pop`:弹出堆栈顶部的元素。

3、`peek`:查看堆栈顶部的元素,但不弹出。

(二)队列(Queue)队列是另一种特殊的线性表,其操作遵循“先进先出”(First In First Out,FIFO)的原则。

可以将队列想象成一个排队的队伍,新元素在队尾加入,而取出元素从队首进行。

队列的基本操作包括:1、`enqueue`:将元素加入队列的尾部。

2、`dequeue`:取出并删除队列头部的元素。

3、`front`:查看队列头部的元素,但不取出。

四、实验内容(一)堆栈的实现```pythonclass Stack:def __init__(self):selfitems =def push(self, item):selfitemsappend(item)def pop(self):if not selfis_empty():return selfitemspop()else:return "Stack is empty" def peek(self):if not selfis_empty():return selfitems-1else:return "Stack is empty" def is_empty(self):return len(selfitems) == 0 def size(self):return len(selfitems)```(二)队列的实现```pythonclass Queue:def __init__(self):selfitems =def enqueue(self, item):selfitemsappend(item)def dequeue(self):if not selfis_empty():return selfitemspop(0) else:return "Queue is empty" def front(self):if not selfis_empty():return selfitems0else:return "Queue is empty" def is_empty(self):return len(selfitems) == 0 def size(self):return len(selfitems)```(三)应用实例1、利用堆栈实现括号匹配的验证```pythondef is_balanced_parentheses(exp):stack = Stack()for char in exp:if char in '({':stackpush(char)elif char in ')}':if stackis_empty():return Falsetop = stackpop()if (char ==')' and top!='(') or (char =='}' and top!='{') or (char =='' and top!=''):return Falsereturn stackis_empty()```2、利用队列实现打印杨辉三角的前 n 行```pythondef print_yanghui_triangle(n):queue = Queue()queueenqueue(1)print(1)for i in range(1, n):prev_row =for _ in range(i + 1):num = queuedequeue()prev_rowappend(num)print(num, end="")if _< i:new_num = prev_row_ +(prev_row_ 1 if _> 0 else 0) queueenqueue(new_num)print()```五、实验结果与分析(一)堆栈实验结果对于括号匹配的验证,输入`"((()))"`,输出为`True`,表示括号匹配正确;输入`"((())"`,输出为`False`,表示括号匹配错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实习报告题目:设计一个演示用运算优先法对算数表达式求职过程的程序。

班级:姓名:学号:完成日期:一、需求分析1建立运算数栈SqStack1和运算符栈SqStack2辅助分析算符有限关系.2用户输入以“#”结尾的算数表达式,本程序需要用户自行输入表达式(运算符可以是加(+);减(-);乘(*);除(/);括号(())),以字符形式读入,在读入的同时,完成运算符和运算数的识别处理,在识别出运算数的同时,要将其字符序列形式转换成整数形式。

3在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容,即演示运算操作。

4测试数据见原题。

5程序执行的命令包括:(1)建立算数表达式;(2)得到运算表达式的值;(3)演示运算过程。

二、概要设计1.设定栈的抽象数据类型定义:ADT Stack{数据对象D={ ai | ai ∈charSet, i=1,2,...,n, n≥0 }数据关系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }(约定an 端为栈顶,a1 端为栈底)基本操作:InitStack(&S)操作结果:构造一个空栈S。

Gettop(S,&e)初始条件:栈S已存在。

操作结果:若栈S不空,则以e返回栈顶元素。

Push(&S,e)初始条件:栈S 已存在。

操作结果:插入元素e 为新的栈顶元素。

Pop(&S,&e)初始条件:栈S 已存在且非空。

操作结果:删除S 的栈顶元素,并用e 返回其值。

}ADT Stack2.本程序包括三个模块(1)主程序模块:V oid main( ){初始化;函数;}(2)栈模块——实现栈抽象数据类型(3)运算模块——实现运算并演示其过程模块各模块之间调用关系如下:三、详细设计1、元素类型、结点类型typedef struct{int *base;int *top;int stacksize;}SqStack1; //操作数栈typedef struct{char *base;char *top;int stacksize;}SqStack2; //操作符栈2、栈类型typedef struct{char *base;char *top;int stacksize;}Stack; //栈类型栈的基本操作设置如下:void InitStack(Stack &S)//初始化,设S为空栈(S.top=NULL)Status GetTop(Stack S,ElemType e)//若栈S不空,则以e带回栈顶元素并返回TRUE,否则返回FALSEStatus Push(Stack&S,ElemType e)//若分配空间成功,则在S的栈顶插入新的栈顶元素e,并返回TRUE,//否则返回FALSE其中部分操作的算法:Status Push(Stack &S,ElemType e){//若分配空间成功,则在S的栈顶插入新的栈顶元素e,并返回TRUE;//否则栈不变,并返回FALSEif(MakeNode(p,e)){P.next=S.top;S.top=p;S.size++;Return TRUE;}else return FALSE;}Status Pop(Stack &S,ElemType &e){//若栈不空,则删除S的栈顶元素并以e带回其值,且返回TRUE,//否则返回FALSE,且e无意义if(StackEmpty(S)) return FALSE;else{p=S.top;S.top=S.top->next;e=p->:data;S.size--;return TRUE;}}3、运算代码int Operate(int a,char theta,int b) //计算表达式值:主要是将大的表达式转化成小的表达式进行逐步求值{int c;if(theta=='+') c=a+b;else if(theta=='-') c=a-b;else if(theta=='*') c=a*b;else c=a/b;return c;}//Operateint result(SqStack1 *OPND,SqStack2 *OPTR) //求值{char a=0;char theta;int b,c,number=0;IntInitStack(OPND);CharInitStack(OPTR);CharPush(OPTR,'#');a=getchar();while(a!='#' || CharGetTop(OPTR)!='#'){printf("输入字符:%c ",a);if(!In(a)) //不是运算符则进栈{number=0;while(!In(a)){number = number*10 +(a-48); //处理多位整数z=10*x+ya = getchar();}IntPush(OPND,number);printf("主要操作:Push(OPND,%d) ",number);}elseswitch(Precede(a,CharGetTop(OPTR))){case '<':CharPush(OPTR,a);a=getchar();printf("主要操作:Push(OPTR,%c) ",a);break;case '=':CharPop(OPTR);a=getchar();printf("主要操作:Pop(OPTR,%c) ",a);break;case '>':theta=CharPop(OPTR);c=IntPop(OPND);b=IntPop(OPND);IntPush(OPND,Operate(b,theta,c));printf("主要操作:Operate(%d,%c,%d) ",b,theta,c);break;}printf("OPND栈:%d OPTR 栈:%c\n",IntGetTop(OPND),CharGetTop(OPTR));}printf("The result is %d.\n",IntGetTop(OPND)); //打印输出表达式值return OK;}4.主函数和其他函数的代码void main() //主函数,使用自定义函数完成功能{SqStack1 s1,*OPND;SqStack2 s2,*OPTR;OPND=&s1;OPTR=&s2;printf("Please enter an expression with a end of '#'.\n");printf("The Expression:");result(OPND,OPTR);}char Precede(char a,char b)//运算优先级判断{int i,j;char Table[8][8]={' ','+','-','*','/','(',')','#','+','>','>','<','<','<','>','>','-','>','>','<','<','<','>','>','*','>','>','>','>','<','>','>','/','>','>','>','>','<','>','>','(','<','<','<','<','<','=',' ',')','>','>','>','>',' ','>','>','#','<','<','<','<','<',' ','=',}; //优先级表格for(i=0;i<8;i++)if(Table[0][i]==a) //纵坐标寻找break;for(j=0;j<8;j++) //横坐标寻找if(Table[j][0]==b)break;return Table[j][i];}int In(char c) //判断c是否为操作符{if ( c=='(' || c=='+' || c=='-' || c == '*' || c=='/' || c==')' || c=='#' || c=='^')return 1; //如果是操作符返回1elsereturn 0; //不是,返回0}5.函数的调用关系图反映了演示程序的层次结构:四、调试分析算术表达式求值程序较为庞大,调试花费时间较多,主要是在for循环和while循环时容易出错,对于涉及的循环的操作开始和结束条件设置很关键。

五、用户手册1.本程序开发环境为VC 6.0,运行环境为dos操作系统,执行文件为:1.exe2.运行该程序后,产生如下图所示的界面:3.按照提示输入一组表达式。

相关文档
最新文档