当前位置:文档之家› 实验03:堆栈应用括号匹配实验报告

实验03:堆栈应用括号匹配实验报告

实验03:堆栈应用括号匹配实验报告
实验03:堆栈应用括号匹配实验报告

深圳大学实验报告

课程名称:数据结构实验与课程设计

实验项目名称:堆栈应用括号匹配实验

学院:计算机与软件学院

专业:未分

指导教师:杨芳

报告人:李楚煌学号:2013150383 班级:8

实验时间:2014-10-9

实验报告提交时间:2014-10-10

教务处制

一、实验目的

掌握堆栈的基本原理

掌握堆栈的存储结构

掌握堆栈的进栈、弹栈、判断栈空的实现方法

掌握应用堆栈实现括号匹配的原理和实现方法

二、实验要求

熟悉C++语言编程

熟练使用C++语言实现堆栈的进栈Push、插入Pop、判断栈空等操作

熟练使用堆栈实现括号匹配算法

三、实验内容

本次实验有两项内容:

(一)堆栈应用括号匹配

1、问题描述

一个算术表达式中包括圆括号、方括号和花括号三种形式的括号

编程实现判别表达式中括号是否正确匹配的算法

2、算法

顺序扫描算术表达式

若算术表达式扫描完成,此时如果栈空,则正确返回(0);如果栈未空,说明左括号多于右括号,返回(-3)

从算术表达式中取出一个字符,如果是左括号(‘(‘或‘[‘或‘{‘),则让该括号进栈(PUSH)

如果是右括号(‘)‘或‘]‘或‘}‘):

⑵ 、如果栈为空,则说明右括号多于左括号,返回(-2)

⑵、如果栈不为空,则从栈顶弹出(POP)一个括号:若括号匹配,则转1继续进行判断;否则,说明左右括号配对次序不正确,返回(-1)

3、输入

第一行:样本个数,假设为n。

第二到n+1行,每一行是一个样本(算术表达式串),共n个测试样本。

4、输入样本

4

{[(1+2)*3]-1}

{[(1+2]*3)-1}

(1+2)*3)-1}

{[(1+2)*3-1]

5、输出

共有n行,每一行是一个测试结果,有四种结果:

0:左右括号匹配正确{[(1+2)*3]-1}

-1:左右括号配对次序不正确{[(1+2]*3)-1}

-2:右括号多于左括号(1+2)*3)-1}

-3:左括号多于右括号{[(1+2)*3-1]

6、输出样本

-1

-2

-3

(二)数制转换

1、问题描述

对于任意十进制数转换为k进制,包括整数部分和小数部分转换。整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换

整数部分19,小数部分0.125

19 / 2 = 9 ... 10.125 * 2 = 0.25 0

9 / 2 = 4 ... 10.25 * 2 = 0.5 0

4 / 2 = 2 ... 0 0.5 * 2 = 1 (1)

2 / 2 = 1 0

1 / 2 = 0 (1)

所以整数部分转为 10011,小数部分转为0.001,合起来为10011.001

提示整数部分可用堆栈,小数部分可用队列实现

注意:必须按照上述方法来实现数制转换,其他方法0分

2、输入

第一行输入一个t,表示下面将有t组测试数据。

接下来每行包含两个参数n和k,n表示要转换的数值,可能是非整数;k表示要转换的数制,1

3、输出

对于每一组测试数据,每行输出转换后的结果,结果精度到小数点后3位

4、输入样本

2

19.125 2

15.125 16

5、输出样本

10011.001

F.200

四、程序清单

代码1:

#include usingnamespace std;

#include

#define Maxsize 100

Class Stack

{

public:

char*data;

inttop;

Stack()

{

top=0;

data=new char[Maxsize]; }

intpush(chara)

{

data[top++]=a;

return1;

}

charpop()

{

top--;

return data[top];

}

~Stack()

{

delete[]data;

}

};

intmain()

{

charData[Maxsize];

inti,jun=2;

freopen("cin.txt","r",stdin);

cin>>i;

while(i)

{

Stack s1;

cin>>Data;

for(intj=0;j

switch(Data[j])

{

case'{':

case'[':

case'(':

{

s1.push(Data[j]);

j++;

break;

}

case'}':

{

if(s1.top!=0)

{

if(s1.pop()=='{')

{

j++;

break;

}

else

{

jun=-1;

cout<

break;

}

}

else

{

s1.push(Data[j]);

j++;

jun=0;

break;

}

}

case']':

{

if(s1.top!=0)

{

if(s1.pop()=='[')

{

j++;

break;

else

{

jun=-1;

cout<

break;

}

}

else

{

s1.push(Data[j]);

j++;

jun=0;

break;

}

}

case')':

{

if(s1.top!=0)

{

if(s1.pop()=='(')

{

j++;

break;

}

else

{

jun=-1;

cout<

break;

}

}

else

{

s1.push(Data[j]);

jun=0;

j++;

break;

}

}

default:

{

j++;

}

}

}

if(s1.top==0)

cout<<0<

elseif(jun!=-1)

{

chara=s1.pop();

if(a=='('||a=='['||a=='{') cout<<-3<

if(a==')'||a==']'||a=='}') cout<<-2<

}

jun=2;

i--;

}

return0;

}

2:

#include

using namespace std;

const int Length = 20;

void Tran(int e)

{

switch(e)

{

case 10:

cout<<'A';break;

case 11:

cout<<'B';break;

case 12:

cout<<'C';break;

case 13:

cout<<'D';break;

case 14:

cout<<'E';break;

case 15:

cout<<'F';break;

}

}

//栈

struct SqStack

{

int *top;

int *base;

int stacksize;

};

bool InitStack(SqStack &S)

{

S.base = (int *)new int[Length * sizeof(int)];

if(!S.base)

return false;

S.top = S.base;

S.stacksize = Length;

return true;

}

bool DestroyStack(SqStack &S)

{

delete S.base;

return true;

}

bool Push(SqStack &S,int e) {

*S.top++ = e;

return true;

}

bool Pop(SqStack &S,int &e) {

if(S.top == S.base)

return false;

e = *--S.top;

return true;

}

bool StackEmpty(SqStack &S) {

if(S.base == S.top)

return true;

else

return false;

}

//队列

struct SqQueue

{

int *base;

int front;

int rear;

};

bool InitQueue(SqQueue &Q)

{

Q.base = (int *)new int[Length * sizeof(int)];

if(!Q.base)

return false;

Q.front = Q.rear = 0;

return true;

}

bool EnQueue(SqQueue &Q,int e)

{

Q.base[Q.rear] = e;

Q.rear++;

return true;

}

bool DeQueue(SqQueue &Q,int &e)

{

if(Q.front == Q.rear)

return false;

e = Q.base[Q.front];

Q.front++;

return true;

}

bool DestroyQueue(SqQueue &Q)

{

delete Q.base;

return true;

}

//转换数制

void Conversion(double test,int radix)

{

int Integer = test,e,i,d;

double Decimal = test - Integer;

SqStack IntegerStack;

SqQueue DecimalQueue;

InitStack(IntegerStack);

while(Integer)

{

Push(IntegerStack,Integer%radix);

Integer /= radix;

}

while(!StackEmpty(IntegerStack))

{

Pop(IntegerStack,e);

if(radix <= 10)

cout<

else

Tran(e);

}

cout<<".";

InitQueue(DecimalQueue);

i = 3;

while(i)

{

EnQueue(DecimalQueue,int(Decimal*radix));

Decimal = (Decimal*radix - int(Decimal*radix));

i--;

}

i = 3;

while(i)

{

DeQueue(DecimalQueue,d);

if(d <= 10)

cout<

else

Tran(d);

i--;

}

DestroyStack(IntegerStack);

DestroyQueue(DecimalQueue);

}

int main()

{

int i,t,radix;

double testData;

//freopen("cin2.txt","r",stdin);

cin>>t;

for(i = 0;i < t;i++)

{

cin>>testData>>radix;

Conversion(testData,radix);

cout<

}

return 0;

}

五、程序运行时截图

1:

2:

六、实验心得与体会(实验中遇到的问题及解决方案,或写点感想)多练习,多思考。

2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

堆栈应用

1引言 本课程主要是对栈的一些基本操作以及栈的应用进行设计的,栈是操作受限的线性表,先进后出,可称为限定性的数据结构]1[。栈的基本操作包括栈的初始化,进栈操作、出栈操作、取栈顶元素、判读栈是否为空、判断栈是否满以及对栈的置空,通过这些基本操作的组合来实现进制转换、括号匹配、文本输入。 2问题分析 2.1进制转换 将一个十进制的数转换为另一进制,基于数的组成原理位权与进制,转换时让十进制数除以该进制,得到的便是最低位上的数,用得到的商再除以该进制则得到次低位上的数,依次循环下去直到得到的商为0;进制转换完毕,可以看出我们得到首先的是最低位,而数据的书写形式是从高位到低位,所以选择栈的存储结构先进后出,得到的余数顺序进栈,等到结束再顺序出栈输出,这时就是我们先要的结果。 2.2括号匹配 括号匹配是对于一组括号的判断,当输入一个左括号时,它就会等待与之相应的右括号出现,如果等来的却是另一个左括号,那么这时最迫切等待的是刚输入的那个左括号,它会等待与之相应的右括号出现。如果等来了与之相应的右括号,那么它得到了匹配,现在迫切等待的是它之前的左括号,可以看出先进去的左括号迫切需要的程度没后来进去的左括号强,后来者居上,我们选择栈的存储结构,先来的括号进栈,栈顶元素是需要程度最强的,得到了匹配则退栈。 2.3文本输入 文本输入是对于文章来说的,而输入文本时时常会出错,当输入特定的字符时我们会删除该行最后的文字,当错误太多时我们会整行删除,输入特定字符时换行。可以看出这些操作都是在文本的最后执行,所以我们也选择栈存储结构,输入一个字符进栈,输入特定的字符1让栈顶元素出栈,输入特定字符2,则将栈清空。如果栈满,则将文本输出,并且置空,接受下一行的文本,直到输入结束。 由于三种功能用到栈的类型一样,所以我们定义一个类型栈就可以了,栈的定义,如下: typedef char status; typedef struct { status *base; status *top; int stacksize; }sqstack;

大学物理实验报告及答案

(此文档为word格式,下载后您可任意编辑修改!) 大学物理实验报告答案大全(实验数据及思考题答案全包括) 伏安法测电阻 实验目的(1) 利用伏安法测电阻。 (2) 验证欧姆定律。 (3) 学会间接测量量不确定度的计算;进一步掌握有效数字的概念。 U 实验方法原理根据欧姆定律,R =,如测得U 和I 则可计算出R。值得注意的是,本实验待测电阻有两只, I 一个阻值相对较大,一个较小,因此测量时必须采用安培表内接和外接两个方式,以减小测量误差。 实验装置待测电阻两只,0~5mA 电流表1 只,0-5V 电压表1 只,0~50mA 电流表1 只,0~10V 电压表一只,滑线变阻器1 只,DF1730SB3A 稳压源1 台。 实验步骤本实验为简单设计性实验,实验线路、数据记录表格和具体实验步骤应由学生自行设计。必要时,可提示学生参照第2 章中的第2.4 一节的有关内容。分压电路是必须要使用的,并作具体提示。 (1) 根据相应的电路图对电阻进行测量,记录U 值和I 值。对每一个电阻测量3 次。 (2) 计算各次测量结果。如多次测量值相差不大,可取其平均值作为测量结果。 (3) 如果同一电阻多次测量结果相差很大,应分析原因并重新测量。 数据处理 (1) 由?U =U max ×1.5% ,得到?U 1 = 0.15V,?U2 = 0.075V ; (2) 由?I = I max ×1.5% ,得到?I 1 = 0.075mA,?I 2 = 0.75mA; (3) 再由u= R ( ?U )2 + ( ?I ) 2 ,求得u= 9 ×101?, u= 1?; R 3V 3I R1 R2 (4) 结果表示R1 = (2.92 ± 0.09) ×10光栅衍射实验目的 (1) 了解分光计的原理和构造。 (2) 学会分光计的调节和使用方法。?, R 2 = (44 ±1)? (3) 观测汞灯在可见光范围内几条光谱线的波长实验方法原理

拉普拉斯变换实验报告答案

评分:《信号与系统》 实验报告 实验题目:拉普拉斯变换 实验班级: 姓名: 学号: 指导教师: 实验日期:

拉普拉斯变换实验 一、实验目的: 1、了解拉普拉斯变换及其逆变换的符号方法; 2、了解由系统函数零、极点分布决定时域特性,并绘制出图形; 3、了解由系统函数零、极点分布决定时域特性,并绘制出图形。 二、实验设备:多媒体计算机,matlab软件。 三、实验内容: 1.例题4-8 求下示函数的逆变换 F(s)=10(s+2)(s+5)/s(s+1)(s+3) 该题中,所编程序为: clear all, close all, clc; %清除所有变量并清除屏幕内容 syms s; %定义系统s f = ilaplace(10*(s+2)*(s+5)/s/(s+1)/(s+3)) %进行拉式变换 实验结果: f = 100/3 - (10*exp(-3*t))/3 - 20*exp(-t) 2.例题4-9 求下示函数的逆变换 F(s)=(s^3+5s^2+9s+7)/(s+1)(s+2) 该题中,所编程序为: clear all, close all, clc; %清除所有变量并清除屏幕内容 b = [1,5,9,7]; %函数分子的系数 a1 = [1,1]; %函数分母第一个因式的系数 a2 = [1,2]; %函数分母第二个因式的系数 a = conv(a1,a2); %令a的值使a1,a2收敛 [r,p,k] = residue(b,a) %是函数部分分式展开 运行结果为: r = -1 2

p = -2 -1 k = 1 2 3.例题4-10 求下示函数的逆变换 F(s)=(s^2+3)/(s^2+2s+5)(s+2) 该题中,所编程序为: clear all, close all, clc; %清除所有变量并清除屏幕内容 b = [1,0,3]; %函数分子的系数 a1 = [1,2,5]; %函数分母第一个因式的系数 a2 = [1,2]; %函数分母第二个因式的系数 a = conv(a1,a2); %令a的值使a1,a2收敛 [r,p,k] = residue(b,a) %是函数部分分式展开 运行结果为: r = -0.2000 + 0.4000i -0.2000 - 0.4000i 1.4000 p = -1.0000 + 2.0000i -1.0000 - 2.0000i -2.0000 k = [] 4.例题4-12 求下示函数的逆变换 F(s)=(s-2)/s(s+1) ^3 该题中,所编程序为: clear all, close all, clc; %清除所有变量并清除屏幕内容

数据结构课程设计---括号匹配

目录 1 问题描述 (2) 1.1题目 (2) 1.2问题 (2) 1.3要求 (2) 2 设计 (2) 2.1存储结构设计 (2) 2.2主要算法设计 (3) 2.3测试用例及测试结果 (6) 3 调试报告 (9) 4 对设计和编码的讨论和分析 (20) 4.1设计 (20) 4.2对编码的讨论 (21) 5 总结和体会 (22) 附录一 (24) 本科生课程设计成绩评定表................... 错误!未定义书签。

数据结构课程设计 ——判别括号配对 1问题描述 1.1题目: 判别括号配对 1.2问题: 一个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使用。写一程序,判断任一算术表达式中所含括号是否正确配对。 1.3要求: (1)表达式从键盘输入。 (2)利用栈求解此问题。 (3)测试用例自己设计。 2设计 2.1存储结构设计 题目要求利用栈来求解此问题,因此选择顺序栈作为存储结构,具体表示如下: #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

char *base; char *top; int stacksize; }SqStack; 2.2主要算法设计 2.2.1算法思想 (1)文字描述 从键盘输入一个表达式; 逐个扫描表达式中的字符; 当遇到左括号时,将左括号入栈; 继续扫描,将此后遇到的第一个右括号与栈顶元素比较,若匹配,则栈顶元素出栈;否则,继续扫描; 当整个表达式扫描完以后,判断栈内是否还有元素,若有,则括号不匹配; 若栈为空,则括号配对成功; 在括号配对不成功的情况下,利用栈顶栈底元素的差值,可以对左右括号数进行比较。(2)流程图表示

实验二 堆栈和队列基本操作的编程实现

实验二堆栈和队列基本操作的编程实现 【实验目的】 堆栈和队列基本操作的编程实现 要求: 堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。 【实验性质】 验证性实验(学时数:2H) 【实验内容】 内容: 把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。可以实验一的结果自己实现数据输入、数据显示的函数。 利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。 【思考问题】 1.栈的顺序存储和链表存储的差异? 2.还会有数据移动吗?为什么? 3.栈的主要特点是什么?队列呢? 4.栈的主要功能是什么?队列呢? 5.为什么会有环状队列? 【参考代码】 (一)利用顺序栈实现十进制整数转换转换成r进制 1、算法思想 将十进制数N转换为r进制的数,其转换方法利用辗转相除法,以N=3456,r=8为例转换方法如下: N N / 8 (整除)N % 8(求余) 3456 432 0 低 432 54 0 54 6 6 6 0 6 高 所以:(3456)10 =(6600)8 我们看到所转换的8进制数按底位到高位的顺序产生的,而通常的输出是从高位到低位的,恰好与计算过程相反,因此转换过程中每得到一位8进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。 算法思想如下:当N>0时重复1,2 ①若N≠0,则将N % r 压入栈s中,执行2;若N=0,将栈s的内容依次出栈,算法结束。 ②用N / r 代替N 2、转换子程序

10-11-2实验报告(答案)

. 《C程序设计》 实验报告 学期:2010--2011学年第二学期 教师姓名: 教研室:

实验1 熟悉C语言程序的运行环境,掌握数据描述 1.1 实验目的 1.了解在开发环境中如何编辑、编译、连接和运行一个C语言程序。 2.通过运行简单的C语言程序,初步了解C语言程序的结构特点。 3.掌握C语言数据类型的概念,学会使用C语言的相关运算符构成表达式。 1.2 实验预习 1.熟悉Visual C++的启动和退出及Visual C++中的编辑、编译、连接和运行命令。 2.了解下列命令及函数:include、main、printf、scanf。 3.熟悉Visual C++环境下每个菜单项的功能及相关命令对应的操作。 4.各种数据类型变量的定义形式及取值范围;熟悉下列标识符的含义。 int、short (int)、long (int)、unsigned (int)、float、double、char、void 5.各类运算符的优先级和结合规则。 6.常量与变量的区别和联系。 运行环境: 1.双击桌面Visual C++快捷方式进入Visual C++,或通过执行“开始——>程序——> Microsoft Visual Studio 6.0——>Microsoft Visual C++6.0”或执行文件"C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Bin\MSDEV.EXE"。 2.单击“文件”菜单的“新建”命令。 3.在打开的“新建”对话框中选择“文件”标签。 4.选择C++ Source File,在目录输入栏选择文件保存位置,然后在文件输入栏中输入文件名,扩展名为.c (例如first.c) ,单击确定按钮。如图所示: 5.在源窗口中输入源程序,如图所示。

实验报告9答案

实验报告 课程名称:高级语言程序设计 实验九:函数与数组 班级: 学生姓名: 学号: 专业: 指导教师: 学期:2010-2011学年上学期 云南大学信息学院

一、实验目的 1、掌握数组作为参数的函数编写与调用方法 2、掌握数组作为参数的特殊性 3、掌握字符串作为参数的函数编写与调用方法 二、知识要点 1、地址传递的概念及使用 2、数组元素和数组名作为函数参数的特点与区别 3、字符串作为参数的特点:‘\0’字符的使用 三、实验预习(要求做实验前完成) 1、数组作为函数参数时,其特殊性是 2、定义作为参数的函数时,通常需要提供长度作为参数;而定义 作为参数的函数时,通常不需要提供长度参数 3、写出满足如下要求函数的函数首部: ①函数名为fmax,求一个实型数组的最大元素值: ②函数名为scount,求一个字符串中大写字母的个数: ③函数名为delf,删除一个字符串的第一个字符: 四、实验内容 1、编写一个函数,其功能是将字符串中的大写字母改为小写字母,其他字 符不变。 2、编写一个函数,求出给定的二维数组中每一行最大的元素,并显示出来。 3、在主函数中输入N个人的某门课程的成绩,分别用函数求:①平均分、最 高分和最低分;②分别统计90~100分的人数、80~89分的人数、70~ 79分的人数、60~69分的人数及59分以下的人数。结果在主函数中输出。 五、实验结果(要求写出运行界面及输出的运行结果) 六、实验小结

1.#include #include void change(char a[]) {int i; for(i=0;i='A'&&a[i]<='Z') a[i]+=32; } void main() {char c[30],k; printf("请输入一个包含大写字母的字符串:\n"); gets(c); change(c); puts(c); } 2.#include void max(int b[3][3]) {int i,j,max[3]; for(i=0;i<3;i++) max[i]=b[i][0]; for(i=0;i<3;i++) for(j=0;j<3;j++) if(b[i][j]>max[i]) max[i]=b[i][j]; for(i=0;i<3;i++) printf("第%d行最大值为:%d\n",i+1,max[i]); printf("\n"); } void main() {int i,j,a[3][3]; printf("输入3行3列的数组:"); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); printf("数组元素为:\n"); for(i=0;i<3;i++) {for(j=0;j<3;j++) printf("%d ",a[i][j]); printf("\n"); } max(a); } 3. #include

数据结构实验报告(栈_括号匹配) (1)

数据结构课程设计报告 设计题目:括号匹配 院系计算机学院 年级11 级 学生刘云飞 学号E01114295 指导教师王爱平 起止时间9-7/9-14

课程设计目的 1.熟悉并写出栈的逻辑结构表示 2.实现栈的存储表示 3.实现栈的操作 内容 括号匹配 课程设计要求 1.在实验报告中写出栈的ADT表示; 2.在实验报告中给出数据类型定义和核心算法和程序; 3.在实验报告中罗列实验过程中出现的问题和解决的方法; 4.打包上交调试后的完整程序,提交实验报告; 5.实验之前写出实验报告的大概框架,实验过程中填写完整。 6.实验时携带需要上机调试的程序; 7.实验评分:实验之前预习占20%,实验报告书写情况占50%,运行情况30%。概要设计 1.栈的ADT表示 ADT Stack{ 数据对象:D={ai|ai∈ ElemSet,i=1,2,…,n,n>=0} 数据关系:R1={|ai-1,ai ∈D,i=2,…,n} 约定an为栈顶端,a1为栈底端 基本操作: Status InitStack(&s) 操作结果:构造一个空栈s。 Status Push( &s, e) 初始条件:栈s已经存在。 操作结果:插入元素e为新的栈顶元素。 Status Pop( &s, &e) 初始条件:栈s已经存在,并不为空。 操作结果:删除s的栈顶元素,并用e返回其值。 Status Check( &s, e) 初始条件:栈s已经存在,并不为空。 操作结果:判断括号是否匹配。 Status EnterString( &s) }ADT Stack 2.数据类型定义和核心算法和程序 数据类型定义: typedef int Status;

堆栈应用括号匹配实验

深圳大学实验报告 课程名称:数据结构实验与课程设计 实验项目名称:堆栈应用括号匹配实验 学院:计算机与软件学院 专业:未分 指导教师:杨芳 报告人:姜家祥学号:2013150387 班级:08 实验时间:2013-10-9 实验报告提交时间:2014-10-10 教务处制

一、实验目的 掌握堆栈的基本原理 掌握堆栈的存储结构 掌握堆栈的进栈、弹栈、判断栈空的实现方法 掌握应用堆栈实现括号匹配的原理和实现方法 二、实验要求 熟悉C++语言编程 熟练使用C++语言实现堆栈的进栈Push、插入Pop、判断栈空等操作 熟练使用堆栈实现括号匹配算法 三、实验内容 本次实验有两项内容: (一)堆栈应用括号匹配 1、问题描述 一个算术表达式中包括圆括号、方括号和花括号三种形式的括号 编程实现判别表达式中括号是否正确匹配的算法 2、算法 顺序扫描算术表达式 若算术表达式扫描完成,此时如果栈空,则正确返回(0);如果栈未空,说明左括号多于右括号,返回(-3) 从算术表达式中取出一个字符,如果是左括号(‘(‘或‘[‘或‘{‘),则让该括号进栈(PUSH) 如果是右括号(‘)‘或‘]‘或‘}‘): ⑵ 、如果栈为空,则说明右括号多于左括号,返回(-2) ⑵、如果栈不为空,则从栈顶弹出(POP)一个括号:若括号匹配,则转1继续进行判断;否则,说明左右括号配对次序不正确,返回(-1) 3、输入 第一行:样本个数,假设为n。 第二到n+1行,每一行是一个样本(算术表达式串),共n个测试样本。 4、输入样本 4 {[(1+2)*3]-1} {[(1+2]*3)-1} (1+2)*3)-1} {[(1+2)*3-1] 5、输出 共有n行,每一行是一个测试结果,有四种结果: 0:左右括号匹配正确{[(1+2)*3]-1}

(完整版)大学物理实验报告答案大全

大学物理实验报告答案大全(实验数据及思考题答案全包括) 伏安法测电阻 实验目的(1) 利用伏安法测电阻。 (2) 验证欧姆定律。 (3) 学会间接测量量不确定度的计算;进一步掌握有效数字的概念。 实验方法原理根据欧姆定律, I R = U ,如测得U 和I 则可计算出R。值得注意的是,本实验待测电阻有两只, 一个阻值相对较大,一个较小,因此测量时必须采用安培表内接和外接两个方式,以减小测量误差。 实验装置待测电阻两只,0~5mA 电流表1 只,0-5V 电压表1 只,0~50mA 电流表1 只,0~10V 电压表一 只,滑线变阻器1 只,DF1730SB3A 稳压源1 台。 实验步骤本实验为简单设计性实验,实验线路、数据记录表格和具体实验步骤应由学生自行设计。必要时,可提示学 生参照第2 章中的第2.4 一节的有关内容。分压电路是必须要使用的,并作具体提示。 (1) 根据相应的电路图对电阻进行测量,记录U 值和I 值。对每一个电阻测量3 次。 (2) 计算各次测量结果。如多次测量值相差不大,可取其平均值作为测量结果。 (3) 如果同一电阻多次测量结果相差很大,应分析原因并重新测量。 数据处理 测量次数1 2 3 U1 /V 5.4 6.9 8.5 I1 /mA 2.00 2.60 3.20 R1 / Ω 2700 2654 2656

测量次数1 2 3 U2 /V 2.08 2.22 2.50 I2 /mA 38.0 42.0 47.0 R2 / Ω 54.7 52.9 53.2 (1) 由. % max ΔU =U ×1 5 ,得到U 0.15V , 1 Δ = U 0 075V Δ 2 = . ; (2) 由. % max ΔI = I ×1 5 ,得到I 0.075mA, 1 Δ = I 0 75mA Δ 2 = . ; (3) 再由2 2 3 3 ( ) ( ) I I V u R U R Δ Δ = + ,求得9 10 Ω 1Ω 2 1 1 = × = R R u , u ; (4) 结果表示= (2.92 ± 0.09)×10 Ω, = (44 ±1)Ω 2 3 1 R R 光栅衍射 实验目的 (1) 了解分光计的原理和构造。 (2) 学会分光计的调节和使用方法。 (3) 观测汞灯在可见光范围内几条光谱线的波长

括号匹配检验

括号匹配检验,是假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即( [ ] ( ) )或[ ( [ ] )]等为正确的格式,[ ( ] )或( [ ( ))或( ( ) ] )均为不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”概念来描述。整个处理过程与栈的特点相吻合。因此此程序利用链表的头插法特点来完成。 #include "stdlib.h" #include "stdio.h" typedef struct Stack { char ch; struct Stack *next; }Stack,*StackList; char checkinput() /*检查输入数据的合理性*/ { char c; while(1) { printf("input the bracket:"); scanf("%c",&c); getchar(); if(c=='('||c==')'||c=='['||c==']') /*程序的有效性检测*/ break; else { printf("you input wrong! please input again!\n"); continue; } } return c; } int InitStack() /*创建栈的实例*/ { StackList L,s,t; char c; int i=0,n=0; L=(Stack*)malloc(sizeof(Stack));/*创建链表*/ L->next=NULL; while(1)

c=checkinput(); switch(c) { case '(': case '[': s=(Stack*)malloc(sizeof(Stack)); s->ch=c; s->next=L->next; /*头插法实现“栈”的功能*/ L->next=s; i=++n; /*n用来记录压入栈里的凡是左括号的数目*/ break; case ')': case ']': if(i==0) return 0; /*i用来判断第一次输入的括号是否为右括号,是则退出程序*/ t=L->next; if(t->ch+1==c) /*检查是否为'('和')',用他们的ACSII码值来检测*/ { L->next=t->next; /*匹配则删除栈顶元素*/ n--; printf("此项%c括号匹配!\n",t->ch); free(t); } else if(t->ch+2==c) /*检查是否为'['和']'*/ { L->next=t->next; /*匹配则删除栈顶元素*/ n--; printf("此项%c括号匹配!\n",t->ch); free(t); } else return 0; /*此语句判断输入两个括号后不匹配的结果,如'['和')'*/ break; } if(n==0) return 1; }

实验报告答案

实验2:MIPS指令系统和MIPS体系结构 一.实验目的 (1)了解和熟悉指令级模拟器 (2)熟悉掌握MIPSsim模拟器的操作和使用方法 (3)熟悉MIPS指令系统及其特点,加深对MIPS指令操作语义的理解 (4)熟悉MIPS体系结构 二. 实验内容和步骤 首先要阅读MIPSsim模拟器的使用方法,然后了解MIPSsim的指令系统和汇编语言。(1)、启动MIPSsim(用鼠标双击MIPSsim.exe)。 (2)、选择“配置”->“流水方式”选项,使模拟器工作在非流水方式。 (3)、参照使用说明,熟悉MIPSsim模拟器的操作和使用方法。 可以先载入一个样例程序(在本模拟器所在的文件夹下的“样例程序”文件夹中),然后分别以单步执行一条指令、执行多条指令、连续执行、设置断点等的方式运行程序,观察程序的执行情况,观察CPU中寄存器和存储器的内容的变化。 (4)、选择“文件”->“载入程序”选项,加载样例程序 alltest.asm,然后查看“代码”窗口,查看程序所在的位置(起始地址为0x00000000)。 (5)、查看“寄存器”窗口PC寄存器的值:[PC]=0x00000000。 (6)、执行load和store指令,步骤如下: 1)单步执行一条指令(F7)。 2)下一条指令地址为0x00000004,是一条有 (有,无)符号载入字节 (字节,半字,字)指令。 3)单步执行一条指令(F7)。 4)查看R1的值,[R1]= 0xFFFFFFFFFFFFFF80 。 5)下一条指令地址为0x00000008,是一条有 (有,无)符号载入字 (字节,半字,字)指令。 6)单步执行1条指令。 7)查看R1的值,[R1]=0x0000000000000080 。 8)下一条指令地址为0x0000000C ,是一条无 (有,无)符号载入字节 (字节,半字,字)指令。 9)单步执行1条指令。 10)查看R1的值,[R1]= 0x0000000000000080 。 11)单步执行1条指令。 12)下一条指令地址为0x00000014 ,是一条保存字 (字节,半字,字)指令。 13)单步执行一条指令。

括号匹配问题源代码(C语言)

括号匹配问题就是给定任意判别式,然后检验括号的配对出现的情况。 可见输入的表达式有四种可能性:右括号配对次序不正确、右括号多于左括号、左括号多于右括号、左右括号匹配正确。可以先检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。出现非括号字符则跳过。程序流程图如下:

程序代码如下: #include #include #include #include #define MaxSize 50 using namespace std; /*------------主要的数据结构类型 --------------*/ struct Text { int top; char Szstack[MaxSize]; }; /*-------------程序功能模块函数-------------*/ //检验栈是否为空 bool IsEmpty(Text G) { if(G.top==-1) return true; else return false; } //检验栈是否为满 bool IsFull(Text G) { if(G.top==MaxSize-1) return true; else return false; } //弹出栈顶元素 char Pop(Text G) { char n=G.Szstack[G.top]; return n; } //检验括号是否配对 int Check(char *A) { int i; Text G; G.top=-1; int L=strlen(A);

利用顺序栈实现括号匹配 c语言

#include #include //malloc,realloc #include //含有overflow #include //exit() #define S_SIZE 100 //栈的空间大小 #define STACKINCREAMENT 10//增加空间 struct SqStack{ int *base; //栈底 int *top; //栈顶 int stacksize; //栈当前的存储空间 }; void main() {//子函数声明 void InitStack(SqStack &S);//初始化空栈 int StackEmpty(SqStack S);//判空 void push(SqStack &S,int e);//进栈 void pop(SqStack &S,int &e);//出栈 //主函数开始 SqStack s;//初始化空栈 InitStack(s); char ch[100],*p;int e; p=ch; printf("输一个含义有()[]{}的括号表达式:\n"); gets(ch); while(*p) { switch (*p) { case '{': case '[': case '(': push(s,*p++);break;//只要是左括号就入栈 case '}': case ']': case ')':pop(s,e); if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')')) p++; else {printf("括号不匹配!");exit(OVERFLOW);} break; default :p++;//其他字符就后移 } } if (StackEmpty(s)) printf("括号匹配成功");

实验报告03答案

实验报告03答案 实验报告03答案 篇一: 实验报告03答案 实验报告03: 数据的输入与输出 一、实验目的 1.掌握Print方法的使用,尤其是各种输出格式的设置。 2.掌握InputBox函数的使用。 3.掌握MsgBox函数和MsgBox语句的使用。 二、实验内容 1.Print函数 25+32=57 (1)语句Print 25+32=; 25 + 32的输出结果 是。 (2)以下程序段的输出结果是。 a = Sqr: b = Sqr: = a b Print 2.InputBox函数: 3.MsgBox函数 要弹出如右图所示的对话框,其语句为:MsgBox 用户名或密 码错误 或者 x = MsgBox

三、思考题 1.在窗体上画一个命令按钮,然后编写如下事件过程:Private sub mand1_lik A = InputBox B = InputBox Print B+A End sub 程序运行后,单击命令按钮,先后在两个输入对话框中分别输入456 和12 3,则输出结果是 D 。 (A)579 (B)123 (C)456 (D)123456 2.以下语句的结果为 Shanghai 。 s$ = Beijing: s$ = Shanghai Print s$ 3.设A= 1234567,则表达式 Val(Mid(A,4, 2)+ Right(A, 4))+3的值为。 学号: 班级: 姓名: 4.执行以下程序段后,变量C$的值为 a$ = Visual Basi Programming : b$ = Quik $ = b$ UCase Right

括号匹配的检查 课程设计

衡阳师范学院 《C语言数据结构》 课 程 设 计 报 告 题目:括号匹配的检验 班级: 1 1 0 1 学号: 作者姓名: 指导教师: 2012年11月

目录 1设计题目与要求 (3) 1.1实验目的 (3) 1.2问题描述 (3) 1.3设计要求 (3) 2总体设计思想及相关知识 (3) 2.1总体设计思想 (3) 2.2开发环境与工具 (4) 3功能设计 (4) 3.1 抽象数据类型的定义 (4) 3.2 栈的基本运算 (4) 3.3栈的基本操作的实现 (4) 3.4模块流程图 (6) 4源程序代码 (6) 5测试及结果 (9) 6总结 (11) 7小组成员任务分配 (11) 参考文献 (12)

1.设计题目与要求 1.1实验目的 通过对括号匹配的检验的程序设计编写,深入了解和掌握栈的使用,了解栈先进后出的特点,掌握栈的表示和实现。 1.2问题描述 假设表达式中允许包括两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[(])或(()])均为不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。例如考虑下列括号序列:[ ( [ ] [ ] ) ] 1 2 3 4 5 6 7 8 当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然而等来的却是第二个括号,此时第一个括号只能暂时靠边,而迫切等待与第二个括号相匹配的,第七个括号的出现,类似的,因等来的第三个括号,其期待的匹配程度较第二个括号更急迫,则第二个括号也只能靠边,让位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第四个括号后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹配成了当前最急迫的任务了,······,依次类推。可见,这个处理过程恰与栈的特点相吻合。 1.3设计要求 读入圆括号和方括号的任意序列,输出“匹配”或“此串括号匹配不合法”。2.总体设计思想及相关知识 2.1总体设计思想 最内层(最迟出现)的左括号必须与最内层(最早出现)的同类右括号匹配,它最期待着急迫的配对。配对之后,期待得以消除。因此为左括号设置一个栈,置于栈顶的左括号期待配对的急切程度最高。另外,在算法的开始和结束时,栈都应该是空的。例如:[()[]]、 ([{}]) 、{([]]}

括号匹配问题

实验报士 括 号匹配问 题

一、实验目的: 1、熟练掌握数据结构基本知识; 2、通过括号匹配的实验,了解栈的表示和栈的基本操作,掌握栈“后进先出”的特性并能够应用这一特性。 二、实验工具:C-Free 三、实验内容: 设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ([( }]) 或({([][ ( ) ] ) } )等均为正确格式,而({[] )、{[()] 或([]} 等均 不正确。在算法中可设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配将栈顶的左括号出栈,否则属于不合法情况。另外,如果输入序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的同类型的左括号,均属不合法情况。当输入序列和栈同时为空时,说明所有括号完全匹配。 四、实验过程: #include #include #define STACKINCREAMENT 10 #define STACK_INIT_SIZE 100 #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int status; typedef char SElemtype; typedef struct { SElemtype *base; SElemtype *top; status stacksize; }sqstack; status Init(sqstack *s) { s->base = (SElemtype *)malloc(STACK_INIT_SIZE * sizeof(SElemtype)); if(!s->base) exit(OVERFLOW); s->top = s->base; s->stacksize = STACK_INIT_SIZE ; return OK; } status push(sqstack *s, SElemtype e) {

大学物理实验报告答案大全(实验数据)

U 2 I 2 大学物理实验报告答案大全(实验数据及思考题答案全包括) 伏安法测电阻 实验目的 (1) 利用伏安法测电阻。 (2) 验证欧姆定律。 (3) 学会间接测量量不确定度的计算;进一步掌握有效数字的概念。 实验方法原理 根据欧姆定律, R = U ,如测得 U 和 I 则可计算出 R 。值得注意的是,本实验待测电阻有两只, 一个阻值相对较大,一个较小,因此测量时必须采用安培表内接和外接两个方式,以减小测量误差。 实验装置 待测电阻两只,0~5mA 电流表 1 只,0-5V 电压表 1 只,0~50mA 电流表 1 只,0~10V 电压表一 只,滑线变阻器 1 只,DF1730SB3A 稳压源 1 台。 实验步骤 本实验为简单设计性实验,实验线路、数据记录表格和具体实验步骤应由学生自行设计。必要时,可提示学 生参照第 2 章中的第 2.4 一节的有关内容。分压电路是必须要使用的,并作具体提示。 (1) 根据相应的电路图对电阻进行测量,记录 U 值和 I 值。对每一个电阻测量 3 次。 (2) 计算各次测量结果。如多次测量值相差不大,可取其平均值作为测量结果。 (3) 如果同一电阻多次测量结果相差很大,应分析原因并重新测量。 数据处理 (1) 由 U = U max ? 1.5% ,得到 U 1 = 0.15V , U 2 = 0.075V ; (2) 由 I = I max ? 1.5% ,得到 I 1 = 0.075mA , I 2 = 0.75mA ; (3) 再由 u R = R ( 3V ) + ( 3I ) ,求得 u R 1 = 9 ? 101 &, u R 2 = 1& ; (4) 结果表示 R 1 = (2.92 ± 0.09) ?10 3 &, R 2 = (44 ± 1)& 光栅衍射 实验目的 (1) 了解分光计的原理和构造。 (2) 学会分光计的调节和使用方法。 (3) 观测汞灯在可见光范围内几条光谱线的波长 实验方法原理

《C数据结构》括号匹配实验报告

括号匹配 实验目的: 使用堆栈的存储结构实现括号匹配,即“(”与“)”必须成对出现、“[”与“]”必须成对出现 实验思路: 1、写出堆栈的相关操作函数,如: 创建【int InitStack( SqStack *S )】、 压入【int Push(SqStack *S,int e)】、 弹出【int Pop(SqStack *S,int *e)】、 销毁【void DestroyStack(SqStack *S)】、 判断是否为空【int StackEmpty(SqStack *S)】等。 2、堆栈的各操作函数完成后编写功能函数——括号匹配函数【int match(char *str)】。 3、括号匹配函数之后编写主函数,使用上述函数实现括号匹配的功能 核心代码: 1、括号匹配函数: int match(char *str){ int i,e; SqStack S; InitStack(&S); for(i=0;;i++){ if(str[i]=='\0')break; if(str[i]=='('||str[i]=='['){ Push(&S,str[i]); }; if(str[i]==')'){ Pop(&S,&e); if(e=='('){ continue; }else{ Push(&S,e); } } if(str[i]==']'){ Pop(&S,&e); if(e=='['){ continue; }else{ Push(&S,e); } }

} if(StackEmpty(&S)){ printf("恭喜您,括号匹配成功,多项式格式合法!\n"); }else{ printf("警告:多项式格式不合法!\n"); } DestroyStack(&S); return 1; } 2、主函数: int main(){ char str[100]; printf("请输入一个表达式:"); scanf("%s",&str); match(str); system("pause"); return 1; } 功能演示: 1、输入:(3+45)*[32-5]/[2-5] 输出:恭喜您,括号匹配成功,多项式格式合法!

2栈的应用上机实验要求

?设计要求 首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。 主控菜单设计要求:程序运行后,显示一个标题“判断表达式括号匹配”,标题下方给出4个菜单项的内容和输入提示: 1.输入表达式 2.输出表达式 3.判断表达式的括号是否匹配并计算表达式的值 4.退出 请选择1—4: ?功能要求 完成各菜单的功能,能正确判断表达式的括号匹配(括号限圆括弧和方括弧两种), 若匹配,利用算符优先法计算表达式的值。 计算表达式值的3个相关函数(后面已给出,可以直接粘贴到程序中使用): I n(c)---- //判断c是否为运算符 Precede(θ1, θ2) ----//判断两运算符θ1, θ2的优先关系 Operate(a, θ, b)---- //做四则运算a theta b,返回运算结果 ?实现要求 1)可用VC++的引用或c语言用指针实现各功能的调用 2)必须用栈实现括号匹配和表达式计算 ?实验提交要求 1)画流程图 2)实现功能的全部程序 3)说明程序设计过程中的难点、解决办法及编程小结或体会。 4)实验及报告必须于2015.4.29提交 Status In(SElemType c) //判断c是否为运算符 { switch(c) { case'+': case'-': case'*': case'/': case'(': case')': case'#': return TRUE; default: return FALSE; } }

char Precede(SElemType t1, SElemType t2) //判断两符号的优先关系{ SElemType f; switch(t2) { case'+': case'-': if(t1=='('||t1=='#') f='<'; else f='>'; break; case'*': case'/': if(t1=='*'||t1=='/'||t1==')') f='>'; else f='<'; break; case'(': if(t1==')') { printf("括号不匹配\n"); exit(OVERFLOW); } else f='<'; break; case')': switch(t1) { case'(': f='='; break; case'#': printf("缺乏左括号\n"); exit(OVERFLOW); default: f='>'; } break; case'#': switch(t1) { case'#': f='='; break; case'(': printf("缺乏右括号\n");

相关主题
文本预览
相关文档 最新文档