栈的应用举例

栈的应用举例
栈的应用举例

内容:数据结构实验报告课程:数据结构

班级:13物联网工程

姓名:* * *

学号:-----------------

日期:2014.10.21

实验目的:

1.熟悉C语言的基本编程方法,掌握集成编译环境的调试方法。

2.学习栈的使用方法。

3.掌握栈操作的实现方法。

4.学习使用栈解决实际问题的能力。

实验内容:

利用栈完成:1.数制转换

2.括号匹配的检验

3.行编辑程序

4.迷宫求解

5.表达式求解

五大功能模块。

**********基本操作的函数原型说明**********

Status InitStack(SqStack &s);

//构造一个空栈S

Status Destory(SqStack &s);

//销毁栈S,S不再存在

Status ClearStack(SqStack &s);

//把栈设置为空

Status StackEmpty(SqStack &s) ;

//判断栈是否为空

int StackLength(SqStack &s)

//返回栈的长度

Status GetTop(SqStack &s,SElemType &e);

//若栈不空,则用e返回S的栈顶元素,并返回OK。否则返回ERROR Status Push(SqStack &s,SElemType e)

//插入元素e为新的栈顶元素

Status Pop(SqStack &s,SElemType &e)

//若栈不空,则删除s的栈顶元素,用e返回其值,并返回ok;否则返回error

Status StackTraverse(SqStack S,Status(*visit)(SElemType))

//从栈底到栈顶依次对栈中每个元素调用函数visit()。

一旦visit()失败,则操作失败

核心代码:

数制转换:

void S_B()

{

int n;

SqStack S;

InitStack(S);

printf("请输入十进制整数n:");

scanf("%d",&n);

SElemType e;

while (n>0)

{

Push(S, n % 8);

n = n/8;

}

printf("该数的八进制数:");

while (!StackEmpty(S))

{

Pop(S,e);

printf("%d",e);

}

printf("\n");

}

括号的匹配检验:

Status EnterString(SqStack &s)

{

SElemType e;

while (1)

{

scanf("%c",&e);

if(e=='('||e=='['||e=='{')

Push(s,e);

else if(e==')'||e==']'||e=='}')

{

if(!Check(s,e))

{

return FALSE;

break;

}

}

else if(e!='\n')

{

x=1;

return FALSE;

break;

}

else

break;

}

}

行编辑程序:

void LineEdit()

{ // 利用字符栈s,从终端接收一行并送至调用过程的数据区。

char ch,c;

SqStack s;

InitStack(s);

InitStack(s);

printf(" 欢迎进入行编辑模块\n");

printf(" '#'为退格符\n");

printf(" '@'表示当前行中字符均无效\n\n");

printf(" 请输入字符:\n");

ch=getchar();

while(ch!=EOF)

{

while(ch!='\n')

{

switch(ch)

{

case '#':Pop(s,c);

break; // 仅当栈非空时退栈

case '@':ClearStack(s);

break; // 重置s为空栈

default :Push(s,ch); // 有效字符进栈

}

ch=getchar(); // 从终端接收下一个字符

}

StackTraverse(s,visit); // 将从栈底到栈顶的栈内字符输出

ClearStack(s); // 重置s为空栈

if(ch !=EOF)

ch = getchar();

}

Destory(s);

}

迷宫求解:

Status MazePath(int maze[12][12],SqStack1 &S, PosType start, PosType end) {

PosType curpos;

int curstep;

SET e;

InitStack(S);

curpos = start;

curstep = 1;

do {

if (Pass(maze,curpos))

{

Markfoot(maze,curpos);

e.di =1;

e.ord = curstep;

e.seat= curpos;

Push1(S,e);

if (curpos.row==end.row && curpos.line==end.line)

return OK;

curpos = NextPos(curpos, 1);

curstep++;

}

else

{

if (!StackEmpty(S))

{

Pop1(S,e);

while (e.di==4 && !StackEmpty(S))

{

Markfoot(maze,e.seat);

Pop1(S,e);

}

if (e.di<4)

{

e.di++;

Push1(S, e);

curpos = NextPos(e.seat, e.di);

}

}

}

} while (!StackEmpty(S));

return ERROR;

}

表达式求值:

float EvaluateExpression(char* MyExpression)

{

// 算术表达式求值的算符优先算法

// 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合SC *OPTR=NULL; // 运算符栈,字符元素

SF *OPND=NULL; // 运算数栈,实数元素

char TempData[20];

float Data,a,b;

char theta,*c,x,Dr[]={'#','\0'};

OPTR=Push(OPTR,'#');

c=strcat(MyExpression,Dr);

strcpy(TempData,"\0");//字符串拷贝函数

while (*c!= '#' || OPTR->c!='#')

{

if (!In(*c, OPSET))

{

Dr[0]=*c;

strcat(TempData,Dr);//字符串连接函数

c++;

if (In(*c, OPSET))

{

Data=atof(TempData);//字符串转换函数(double)

OPND=Push(OPND, Data);

strcpy(TempData,"\0");

}

}

else

{ // 不是运算符则进栈

switch (precede(OPTR->c, *c))

{

case '<': // 栈顶元素优先级低

OPTR=Push(OPTR, *c);

c++;

break;

case '=': // 脱括号并接收下一字符

OPTR=Pop(OPTR);

c++;

break;

case '>': // 退栈并将运算结果入栈

theta=OPTR->c;OPTR=Pop(OPTR);

b=OPND->f;OPND=Pop(OPND);

a=OPND->f;OPND=Pop(OPND);

OPND=Push(OPND, Operate(a, theta, b));

break;

}

}

}

return OPND->f;

}

运行结果:

通过一周的学习和实践,解决实际问题,让我对数据结构有了更深的了

解,对数据结构产生了浓厚的兴趣,同时也让我提高了解决实际问题的能

力。

在这次课程设计的实验中,我收获了许多知识,培养了独立思考、动手

操作的能力。这对我来说是一种锻炼,一个知识积累的过程,一种能力的提高。要打好基础,才能用更好的办法,更简洁明了的程序解决实际问题,只有这样才能进一步的取得更好的成绩。我会更加努力,努力的去弥补自己的缺点,发展自己的优点,去充实自己,只有在了解了自己的长短之后,才会更加珍惜拥有的,更加努力的去完善它,增进它。

虽然我现在的水平还很差,但我还会继续努力的,在解决实际问题时如果遇到了难题,我要学会去查找大量的有关这方面的资料,还要借助于网络不断扩大自己的知识面和阅读量。这样也可以锻炼我们的自主学习能力和解决问题的能力,学到许多以前没学到的东西。

栈的基本操作与应用

实验报告 课程名称数据结构实验名称栈的基本操作与应用 姓名王灵慧专业班级软工18104 学号 201817040409 试验日期 2019-11-06试验地点E3-502指导老师邹汉斌成绩 一、实验目的 1.熟悉并能实现栈的定义和基本操作。 2.了解和掌握栈在递归和非递归算法的应用。 二、实验要求 1.进行栈的基本操作时要注意栈“后进先出”的特性。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。 2.已知函数t(n)=2*t(n/2)+n 其中t(0)=0,n为整数。编写程序实现: (1)计算t(n)的递归算法。 (2)分别用链式栈和顺序栈实现计算t(n)的非递归算法。 四、思考与提高 1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题? 五、实验步骤(每个实验内容包含代码、输入、输出、错误分析): 1、实验内容(1): #include #include #include #define true 1 #define null 0 #define ok 1 #define error 0 #define overflow -1 #define stack_init_size 100 #define stackincrement 10 using namespace std; typedef int selemtype; typedef int status; typedef struct { selemtype *base; selemtype *top; int stacksize; } sqstack; status initstack(sqstack &s) { s.base=(selemtype *)malloc(stack_init_size * sizeof(selemtype)); if(!s.base)exit(overflow);

利用栈实现c语言计算器

栈的应用:C实现简单计算器(表达式的计算) 作为栈的著名应用,表达式的计算可以用下面方法实现: 首先建立两个栈,操作数栈NUM_S和运算符栈OPR_S。 其中,操作数栈用来存储表达式中的操作数;运算符栈用来存储表达式中的运算符。可以用字符‘=’来表示表达式结束符。 自左至右的扫描待处理的表达式,并假设当前扫描到的符号为W,根据不同的符号W 做如下不同的处理: 1.若W为操作数,则将W压入操作数栈NUM_S,且继续扫描下一个字符; 2.若W为运算符,则根据运算符的性质做相应的处理: (0)若符号栈为空,无条件入栈当前指针指向的字符 (1)若w为不大于运算符栈栈顶的运算符,则从操作数栈NUM_S中弹出两个操作数,设先后弹出的操作数为a、b,再从运算符栈 OPR_S中弹出一个运算符,比如为+,然后作运算a+b,并将运算结果压入操作数栈NUM_S。 (2)若w为左括号或者运算符的优先级大于运算符栈栈顶的运算符,则将运算符W 压入运算符栈OPR_S,并继续扫描下一个字符。 (3)若运算符W为右括号,循环操作(设先后弹出的操作数为a、b,再从运算符栈OPR_S中弹出一个运算符,比如为+,然后作运 算a+b, 并将运算结果压入操作数栈NUM_S),直到从运算符栈中弹出第一个左括号。 (4)若运算符W为表达式结束符‘=’,循环操作(设先后弹出的操作数为a、b,再从运算符栈OPR_S中弹出一个运算符,比如为 +,然后作运算a+b, 并将运算结果压入操作数栈NUM_S),直到运算符栈为空为止。此时,操作数栈栈顶元素即为表达式的 值。 ====================================================================== === 举例:计算3+(5-2*3)/4-2= (1)开始栈为空,3入栈,+入栈,(无条件入栈,5入栈,-号优先级比(高,所以-号入栈,2入栈,*优先级比目前栈顶的-号优先级高,所以*入栈,3入栈,接着扫描到)括号,)括号不入栈 | | | | --------- ---------- | 3 | | * | --------- ---------- | 2 | | - |

栈的表示及栈的应用

实验二:栈的表示及栈的应用 【实验目的】 (1) 掌握栈的顺序存储结构及其基本操作的实现。 (2) 掌握栈后进先出的特点,并利用其特性在解决实际问题中的应用。 (3) 掌握用递归算法来解决一些问题。 【实验内容】 1. 编写程序,对于输入的任意一个非负十进制整数,输出与其等值的八进制数(课本P48)。 2. 编写递归程序,实现以下函数的求解(课本P54)。 3. 编写程序,实现Hanoi 塔问题(课本P55-P58)。 【实验步骤】 1.打开VC++。 2.建立工程:点File->New ,选Project 标签,在列表中选Win32 Console Application ,再在右边的框里为工程起好名字,选好路径,点OK->finish 。至此工程建立完毕。 3.创建源文件或头文件:点File->New ,选File 标签,在列表里选C++ Source File 。给文件起好名字,选好路径,点OK 。至此一个源文件就被添加到了你刚创建的工程之中。 4.写好代码 5.编译->链接->调试 【主要代码】进制转换 #include #include #define OK 1 #define ERROR 0 ???>-+-==1 ),2()1(0,1,)(n n Fib n Fib n n n Fib

#define OVERFLOW -2 typedef int Status; typedef int SElemType; #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(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; }//InitStack Status Push(SqStack &S, SElemType e){ //插入元素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; } //PUSH Status Pop(SqStack &S, SElemType &e) { //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

顺序栈的基本操作讲解

遼穿紳範大學上机实验报告 学院:计算机与信息技术学院 专 业 : 计算机科学与技术(师 范) 课程名称:数据结构 实验题目:顺序栈的基本操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号 一、实验目的: 1 ?熟悉掌握栈的定义、结构及性质; 2. 能够实现创建一个顺序栈,熟练实现入栈、出栈等栈的基本操作; 3?了解和掌握栈的应用。 二、实验环境: Microsoft Visual C++ 6.0

三、实验内容及要求: 栈是一种特殊的线性表,逻辑结构和线性表相同,只是其运算规则有更多的限制,故又称为受限的线性表。 建立顺序栈,实现如下功能: 1. 建立一个顺序栈 2. 输出栈 3. 进栈 4. 退栈 5. 取栈顶元素 6. 清空栈 7. 判断栈是否为空 进行栈的基本操作时要注意栈”后进先出”的特性。 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序栈。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作

五、代码: #include #include #define maxsize 64 typedef int datatype; //定义结构体typedef struct { datatype data[maxsize]; int top; }seqstack; //建立顺序栈seqstack *SET(seqstack *s) { int i; s=(seqstack*)malloc(sizeof(seqstack)); s->top=-1; printf(" 请输入顺序栈元素(整型,以scanf("%d",&i); do{ s->top++; s->data[s->top]=i; scanf("%d",&i); 0 结束):"); }while(i!=0); printf(" 顺序栈建立成功\n"); return s; } //清空栈void SETNULL(seqstack *s) { s->top=-1;} //判断栈空 int EMPTY(seqstack *s) { if(s->top>=0) return 0; else return 1;} //进栈 seqstack *PUSH(seqstack *s) { int x; printf(" 你想要插入的数字:"); scanf("%d",&x); if(s->top==maxsize-1) { printf("overflow"); return NULL; } else {

栈和队列的基本操作的实现

封面: 安徽大学 网络工程 栈和队列的基本操作的实现 ______2010\4\12

【实验目的】 1.理解并掌握栈和队列的逻辑结构和存储结构; 2.理解栈和队列的相关基本运算; 3.编程对相关算法进行验证。 【实验内容】 (一)分别在顺序和链式存储结构上实现栈的以下操作(含初始化,入栈,出栈,取栈顶元素等): 1.构造一个栈S,将构造好的栈输出; 2.在第1步所构造的栈S中将元素e 入栈,并将更新后的栈S输出; 3.在第2步更新后所得到的栈S中将栈顶元素出栈,用变量e返回该元素,并将更新后的栈S输出。(二)分别在链队列和循环队列上实现以下操作(初始化,入队,出队,取队头元素等): 1.构造一个队列Q,将构造好的队列输出; 2.在第1步所构造的队列Q中将元素e入队,并将更新后的队列Q输出; 3.在第2步更新后所得到的队列Q中将队头元素出队,用变量e返回该元素,并将更新后的队列Q输出。

【要求】 1.栈和队列中的元素要从终端输入; 2.具体的输入和输出格式不限; 3.算法要具有较好的健壮性,对运行过程中的错误 操作要做适当处理。 三、实验步骤 1.本实验用到的数据结构 (1)逻辑结构:线性结构 (2)存储结构:程序一、四(顺序存储结构); 程序二、三(链式存储结构); 2.各程序的功能和算法设计思想 程序一:顺序栈 # include # include # include #define STACKINITISIZE 100 # define STACKINCREMENT 10 # define OK 1 # define ERROR 0 # define OVERFLOW -2 typedef int SElemtype; typedef int status; typedef struct { SElemtype *base; SElemtype *top; int stacksize; }sqstack; void Initstack (sqstack *s) { (*s).base = (SElemtype *)malloc(STACKINITISIZE * sizeof (SElemtype)); if(!(*s).base) exit(OVERFLOW);

数据结构中栈的介绍

数据结构中栈的介绍 1.栈的概念 栈(Stack)是一种特殊的表,这种表只在表的一端进行插入和删除操作。允许插入和删除数据元素的这一端称为栈顶;而另一固定的一端称为栈底。不含任何元素的栈称为空栈。 栈的修改是按后进先出的原则进行的。栈又称为后进先出(Last In First Out)表,简称为LIFO表。 如图1所示:假设一个栈S中的元素为a n,a n-1,..,a1,则称a1为栈底元素,a n为栈顶元素。 图1 图 2 2.栈的存储与操作 由于栈是一个特殊的表,可以用一维数组来实现栈。同时设立指针t(称为栈顶指针)来指示栈顶元素的当前位置。 我们用一个数组s[1..m]来表示一个栈时,将栈底固定在数组的底部,即s[1]为最早入栈的元素,并让栈向数组上方(下标增大的方向)扩展。当t=0时,表示这个栈为一个空栈。当t=m时,表示这个栈已满。 可以用下列方式定义栈: const m=栈表目数的上限; type stack=array[1..m] of stype; {栈的数据类型} var s:stack; t:integer; {栈顶指针} 进栈、出栈操作的过程和函数(假设栈元素的数据类型为整型): (1)进栈过程(push) ①若t≥m时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②); ②置t=t+1(栈指针加1,指向进栈地址); ③S(t)=x,结束(x为新进栈的元素); procedure push(var s:stack; x:integer;var t:integer); begin if t=m then writeln('overflow') else begin

数据结构栈的定义及基本操作介绍

北京理工大学珠海学院实验报告 ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 班级软件工程3班学号 150202102309姓名郭荣栋 指导教师余俊杰成绩 实验题目栈的实现与应用实验时间 一、实验目的、意义 (1)理解栈的特点,掌握栈的定义和基本操作。 (2)掌握进栈、出栈、清空栈运算的实现方法。 (3)熟练掌握顺序栈的操作及应用。 二、实验内容及要求 1.定义顺序栈,完成栈的基本操作:建空栈、入栈、出栈、取栈顶元素(参见教材45页)。 2. 调用栈的基本操作,将输入的十进制数转换成十六进制数。 3. 调用栈的基本操作,实现表达式求值,如输入3*(7-2)#,得到结果15。 三、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)

四、程序清单(包含注释) 1、2. #include #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 #define INCREASEMENT 10 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

typedef int SElemType; typedef int Status; typedef struct{ SElemType *base; SElemType *top; int stacksize; }Sqstack; void StackTraverse(Sqstack S) { while (S.top != S.base) { cout << *(S.top-1) << endl; S.top--; } } Status InitStack(Sqstack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base){ exit(OVERFLOW); }

数据结构栈的基本操作,进栈,出栈

第五次实验报告—— 顺序栈、链栈的插入和删除一需求分析 1、在演示程序中,出现的元素以数字出现定义为int型, 2、演示程序在计算机终端上,用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在终端上 3、顺序栈的程序执行的命令包括如下: (1)定义结构体 (2)顺序栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)顺序栈的打印结果 3、链栈的程序执行的命令包括如下: (1)定义结构体 (2)链栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)链栈的打印结果 二概要设计 1、顺序栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: InitStack(SqStack &S) 操作结果:构造一个空栈 Push(L,e) 操作结果:插入元素e为新的栈顶元素

Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 2、链栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: LinkStack(SqStack &S) 操作结果:构造一个空栈 Status Push(L,e) 操作结果:插入元素e为新的栈顶元素 Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 3、顺序栈程序包含的主要模块: (1) 已给定的函数库: (2)顺序栈结构体: (3)顺序栈初始化及创建: (4)元素插入 (5)元素删除

实验二_栈、队列地实现与应用

实验二栈、队列的实现及应用 实验课程名:数据结构与算法 专业班级:学号::

/*构造空顺序栈*/ int InitStack(SqStack *S) //InitStack() sub-function { S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if (!S->base) { printf("分配空间失败!\n"); return (ERROR); } S->top = S->base; S->stacksize = STACK_INIT_SIZE; printf("栈初始化成功!\n"); return (OK); } //InitStack() end /*取顺序栈顶元素*/ int GetTop(SqStack *S, SElemType *e) //GetTop() sub-function { if (S->top == S->base) { printf("栈为空!\n"); //if empty SqStack return (ERROR); } *e = *(S->top - 1); return (OK); } //GetTop() end /*将元素压入顺序栈*/ int Push(SqStack *S) //Push() sub-function { SElemType e; if (S->top - S->base>S->stacksize) { S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT*sizeof(SElemType))); if (!S->base) { printf("存储空间分配失败!\n"); return (ERROR); } S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } fflush(stdin);//清除输入缓冲区,否则原来的输入会默认送给变量x

栈的基本操作c语言

#include #include #include //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status 是函数的类型,其值是函数结果状态代码 typedef int Status; typedef int SetElemType; typedef SetElemType ElemType; #include "tou.h" #include #include typedef char SElemType; // 栈的元素类型 #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 // 栈的顺序存储表示P46 typedef struct SqStack { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }SqStack; // 顺序栈 // 构造一个空栈S。 int InitStack(SqStack *S) { // 为栈底分配一个指定大小的存储空间 (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if( !(*S).base ) exit(OVERFLOW); // 存储分配失败 (*S).top = (*S).base; // 栈底与栈顶相同表示一个空栈

数据结构_实验三_栈和队列及其应用

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈与队列及其应用_ 一.实验目得及要求 (1)掌握栈与队列这两种特殊得线性表,熟悉它们得特性,在实际问题背景下灵活运用它们; (2)本实验训练得要点就是“栈”得观点及其典型用法; (3)掌握问题求解得状态表示及其递归算法,以及由递归程序到非递归程序得转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); (2)应用栈得基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中得基本操作(队列得初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中得语法检查(括号得匹配)。 (5)利用栈实现表达式得求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); A、顺序储存: ?代码部分: //Main、cpp: #include"SStack、h" int main() { SqStack S; SElemType e;

int elect=1; InitStack(S); cout << "已经创建一个存放字符型得栈" << endl; while (elect) { Muse(); cin >> elect; cout << endl; switch (elect) { case 1: cout << "input data:"; cin >> e; Push(S, e); break; case 2: if(Pop(S, e)) {cout << e <<" is pop"<< endl; } else{cout<<"blank"<

栈的应用的实验报告

班级学号姓名实验组别 试验日期室温报告日期成绩 报告内容:(目的和要求、原理、步骤、数据、计算、小结等) 实验名称:栈的实现与应用 实验目的; 1.掌握栈的定义。 2.掌握栈基本操作的实现,并能用于解决实际问题。 实验环境(硬/软件要求): Windows 2000, Visual C++ 6.0 实验内容: 1.实现栈的如下基本操作:push,pop,isempty,isfull,createstack. 2.利用栈的基本操作实现conversion()函数,该函数能将任意输出的十进制整数转化为二进制形式表示。 实验要求: 1.用顺序存储结构实现栈的基本操作:push,pop,isempty,isfull,createstack. 2.利用栈的基本操作实现conversion()函数 3.编写主函数完成实验内容2. 【C语言源程序】 #include #include #define maxsize 1024 /*栈的最大容量为1024*/ typedef int datatype; typedef struct { datatype elements[maxsize]; int Top; /*栈指针*/ }Stack; void setNull(Stack *S) {S->Top=-1;} int isfull(Stack *S) {if(S->Top>=maxsize-1)return (1); else return (0); } int isempty(Stack *S) { if(S->Top>=0)return (0); else return (1); } /*isempty*/ void push( Stack *S,datatype E) { if(S->Top>=maxsize-1)

(完整word版)顺序栈基本操作实验报告

数据结构实验三 课程数据结构实验名称顺序栈基本操作第页 专业班级学号 姓名 实验日期:年月日评分 一、实验目的 1.熟悉并能实现栈的定义和基本操作。 2.了解和掌握栈的应用。 二、实验要求 1.进行栈的基本操作时要注意栈"后进先出"的特性。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。 2.编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。 主要功能描述如下: (1)从键盘上输入表达式。 (2)分析该表达式是否合法: ?a) 是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。 ?b) 是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。 ?c) 若是其它字符,则返回错误信息。 (3)若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。 程序中应主要包含下面几个功能函数: ?l void initstack():初始化堆栈 ?l int Make_str():语法检查并计算

?l int push_operate(int operate):将操作码压入堆栈 ?l int push_num(double num):将操作数压入堆栈 ?l int procede(int operate):处理操作码 ?l int change_opnd(int operate):将字符型操作码转换成优先级 ?l int push_opnd(int operate):将操作码压入堆栈 ?l int pop_opnd():将操作码弹出堆栈 ?l int caculate(int cur_opnd):简单计算+,-,*,/ ?l double pop_num():弹出操作数 四、实验步骤 (描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果) 第一题: #include using namespace std; #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 #define OVERFLOW -1 #define OK 1 #define NO -1 #define NULL 0 typedef int Status; typedef char SElemType; typedef struct { SElemType *base; //在栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 } SqStack; Status Initstack(SqStack &S)//构造一个空栈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; }//InitStack Status StackEmpty(SqStack &S) { if(S.base==S.top)

数据结构实验—栈及其应用

《算法与数据结构》课程实验报告

一、实验目的 1.熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈 的基本操作在栈的顺序存储结构。 2.实现栈的顺序存储结构,通过实验深入理解栈的操作特点。 二、实验内容及要求 1.实现栈的存储结构及相关操作:进栈、出栈、取栈顶元素等。 2.使用该栈完成对一个字符串的逆序输出。 3.使用该栈完成判断表达式的括号是否匹配。 4.对算术表达式求值。 三、系统分析 (1)数据方面:该栈数据元素类型采用浮点型,在此基础上进行栈的基本操作,并可将栈中数据使用文本文档保存。在栈的应用中,采用的是存储字符元素类型的栈,并进行对字符的相关操作。 (2)功能方面:能实现栈的一些基本操作,主要包括: 1.进栈操作:若栈不满,则将元素x插入至栈的栈顶,若栈满则进行溢出 处理。 2.出栈操作:若栈不空,则函数返回该栈栈顶的元素,并且栈顶指针退1。 3.获取栈顶元素:若栈不空,则函数返回栈顶元素。 4.判断栈是否为空、判断栈是否满。 5.计算栈中元素个数:直接返回栈中元素个数。 6.清空栈内容:将栈顶指针赋为初始值。 7.保存数据:将栈中元素数据保存至文本文档中。 四、系统设计 (1)设计的主要思路 顺序栈可以采用顺序表作为其存储表示,为此,在顺序栈的声明中用顺序表定义它的存储空间。存放栈元素的数组的头指针为*elements,该数组最大能允许存放元素个数为maxSize,当前栈顶位置由数组下标指针top知识。并规定如果栈不空时,elements[0]为栈中第一个元素。由于实验中还需完成栈的相关应用,故使用两个菜单分别完成栈的基本操作与栈的应用调试。 (2)数据结构的设计 顺序栈定义为只允许在表的末端进行插入和删除的线性表。允许插入和删除的一端叫做栈顶,而不允许插入和删除的另一端叫做栈底。当栈中没有任何元素时则成为空战。即栈又被称为后进先出的线性表,故与线性表的相关操作类似,

实验二栈队列的实现及应用

百度文库-让每个人平等地提升自我 实验二栈、队列的实现及应用 实验课程名:数据结构与算法 专业班级:_ 学号:__________ 姓名: _ 实验时间: ____ 实验地点:指导教师:冯珊__________ 一、实验目的 1掌握栈和队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用。 2、掌握栈和队列的特点,即先进后出与先进先出的原则。 3、掌握栈和队列的基本操作实现方法。 /*顺序栈的存储类型*/ typedef struct

1 2 3 4 5远 兀 1 一 7U- 元 谴 段 囑 :> o 1 2 3 R * 元 元 栈 書 t 出 一 ^ 零 遐 次 :± 谨 虚 1 2 3 ^ 5 I B

D 认戯握结IVl 匚on&ol eAp pli cation!\[>ebu g\Con 5 o-leApp li cation 1 .exe :1 刖人操作谊睪代码(05):2 : h E s 选 的 操 一 兀 一 b 一 丁 一 丁 栈 ? 遐 次 嘆 區 1 2 3 4 5 5 ^ 元 元 栈 S 退 、 灵 岀 祓 S I ■ i 9 I I I i 主 至 ..T' 一 兀 元 栈 £ 1 2 3 4 5 \Z

百度文库 -让每个人平等地提升自我 P入操隹选择代码(0-5>:4 派元素的是 ; 栈 化 出 取 示 艮 i元一一 选 的 操 元 -> 入 中 >c 1- 苴翻(05): 5 栈 化 亍 1 2 元 元 Is 务一(2):完成下列程序,该程序实现栈的链式存储结构,构建链栈(栈中的元素依次为China , Japan, France,India ,Australia ),依次进行进栈和出栈操作,判断栈空和栈满操作,返回栈顶元素操作。 要求生成链栈时,从键盘上读取数据元素。 (1)源代码:#i nclude<> #in clude<> #in clude<> # define OK 1 # define ERROR 0 typedef char DataType; /*链式栈的存储类型*/ typedef struct SNode

栈的类型定义与基本操作

栈的类型定义与基本操 作 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

循环队链的出队 bool Dequeue( CSQueue &q, QElemType &e ) { int front; if( == 0 ) return false; front = ( + 1 - + MAXQSIZE ) % MAXQSIZE; e = [ front ]; --; return true; } 循环队链的入队 bool Enqueue( CSQueue &q, QElemType e ) { if( == MAXQSIZE ) return false; = ( + 1 ) % MAXQSIZE; [ ] = e; ++; return true; } 链队的入队 void Enqueue( LQueue &q, QElemType e ) { LQueuePtr p; p = new QNode; p->data = e; p->next = >next; >next = p; = p; } 链队的出队 bool Dequeue( LQueue &q, QElemType &e ) { LQueuePtr p; if( >next == ) return false; p = >next; e = p->next->data; >next = p->next;

delete p; return true; } 顺序栈的类型定义与基本操作: const StackInitSize=100; const StackInc=10; struct SStack { SElemType *base,*top; isited=false; for(i=1;i<=;i++) if(![i].visited) { visit[i].data); [i].visited=true; Enqueue(q,i); while(Dequeue(q,j)) for(p=[j].firstarc;p;p=p->nextarc) { k=p->adjvex; if(![k].visited) { visit(G>Vexs[k].data); [k].visited=true; Enqueue; } } } } 深度优先搜索遍历 void DFS(ALGraph &G, int i, void visit(VexType)) { int j; Arcptr p; visit[i].data); [i].visited=true; for(p=[i].firstarc ;p; p=p->nextarc) { J=p->adjvex; if(![j].visited) DFS(G,j,visit); } }

栈的类型定义与基本操作

栈的类型定义与基本 操作 Revised on November 25, 2020

循环队链的出队 bool Dequeue( CSQueue &q, QElemType &e ) { int front; if( == 0 ) return false; front = ( + 1 - + MAXQSIZE ) % MAXQSIZE; e = [ front ]; --; return true; } 循环队链的入队 bool Enqueue( CSQueue &q, QElemType e ) { if( == MAXQSIZE ) return false; = ( + 1 ) % MAXQSIZE; [ ] = e; ++; return true; } 链队的入队 void Enqueue( LQueue &q, QElemType e ) { LQueuePtr p; p = new QNode; p->data = e; p->next = >next; >next = p; = p; } 链队的出队 bool Dequeue( LQueue &q, QElemType &e ) { LQueuePtr p; if( >next == ) return false; p = >next; e = p->next->data; >next = p->next;

delete p; return true; } 顺序栈的类型定义与基本操作: const StackInitSize=100; const StackInc=10; struct SStack { SElemType *base,*top; isited=false; for(i=1;i<=;i++) if(![i].visited) { visit[i].data); [i].visited=true; Enqueue(q,i); while(Dequeue(q,j)) for(p=[j].firstarc;p;p=p->nextarc) { k=p->adjvex; if(![k].visited) { visit(G>Vexs[k].data); [k].visited=true; Enqueue; } } } } 深度优先搜索遍历 void DFS(ALGraph &G, int i, void visit(VexType)) { int j; Arcptr p; visit[i].data); [i].visited=true; for(p=[i].firstarc ;p; p=p->nextarc) { J=p->adjvex; if(![j].visited) DFS(G,j,visit); } }

实验4栈的实现和应用

陕西科技大学实验报告 姓名班级学号实验组别 实验日期室温报告日期成绩 报告内容:(目的和要求、原理、步骤、数据、计算、小结等) 一、实验名称:栈的实现与应用 二、实验目的: 1.掌握栈的定义。 2.掌握栈基本操作的实现,并能用于解决实际问题。 三、实验环境:Windows2000,Visual C++ 6.0 四、实验内容: 1.实现栈的如下基本操作:push,pop,isempty,isfull,createstack。 2.利用栈的基本操作实现conversion()函数,该函数能将任意输入的十进制整数转换为二进制形式表示。 五、实验原理: 1.栈的基本概 栈(stack)是一种特殊的线性表。是将线性表的插入和删除均是仅在表的一端进行,通常将允许插入和删除的一端称栈顶(Top),因此栈顶的当前位置是动态变化的,它由一个称为栈顶指针的位置指示器指示。同时,表的一端称栈底(Bottom)。当栈中没有元素时称为空栈。栈的插入操作被形象的称为进栈或入栈,删除操作称为出栈或退栈。 2.栈的结构特性 通常栈可以用线性的方式存储,分配一块连续的存储区域存放栈中的元素,并用一个变量指向当前的栈顶。 每次进栈的元素都被放在原栈顶元素之上而成为新的栈顶,而每次出栈的总是当前栈中“最新”的元素,即最后进栈的元素。元素是以a1,a2,a3,...,an的顺序进栈的,而退栈的次序却是an,...,a3,a2,a1。栈的修改是按后进先出的顺序进行的。因此,栈又称为后进先出的线性表,简称为LIFO表. 3.栈的建立 C语言中用一维数组来实现栈.假设栈的元素个数最大不超过Maxsize,所有的元素都具有同一个数据类datatype,则可以用下列方式来定义栈的类型stack: typedef struct { datatype elements[maxsize]; int Top; }Stack; 4.栈的压入(push) void push(ST,x) stak *ST ; ElemType x; { if(ST->top==Maxsize-1) printf(“栈上溢出!\n”); else { ST->top++; ST->s[ST->top]=x; }} 5.栈的弹出pop(ST) void pop(ST,x) stak *ST ; {

浅谈栈和队列的应用

浅谈栈与队列的应用 摘要:数据结构是计算机中一个非常重要的分支,它是现实世界数据与计算机世界数据连接的关键,它主要涵盖两方面的内容:逻辑层面的数据结构和计算机存储数据物理层的数据结构。关于数据结构中的线性表、栈、队列,将上述两方面的内容进行介绍,进行横向的比较,从而更清楚地看到它们之间的联系与区别,并分析它们在现实计算中的应用。 关键词:线性表;堆栈;队列;应用开发 Discussion on the Application of Stack and Queue Abstract: Data structure is a very important branch of a computer,it is the key of the connection of real world data and computer world data,it mainly covers the following two contents:logic level data structure and computer data storage physical layer data structure.About the data structure of the linear list,stack,queue,it introduces the content of the above-mentioned two aspects,carries on the horizontal comparison,thus more clearly see the relationship and difference between them.And analyzes them in real in the calculation of the application. Key words: Linear List; Stack;Queue;Application Development 0 引言 栈和队列可以看作线性表的特例,它们都具有和线性表相同的存储方式,顺序存储和链式存储,栈有顺序栈和链式栈,队列有顺序队列和链式队列。但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型。由于它们被广泛应用在各种软件系统中,因此在面向对象的程序设计中,它们是多型数据类型[1~2]。 1 基本概念 1.1 线性表的概念和特性 线性表是有限元素(a1,a2,a3…,an)有序序列的集合,a1,a2…,an都是完全相同结构的数据类型,同时它们之间的排列严格有序,其中任何元素都对应唯一的前驱以及唯一的后继。这样一个序列可以有查询、删除、插入队列任何位置的数据操作[3]。 1.2 栈的概念和特性 栈作为一种限定性线性表,它限定插入和删除操作都在表的同一端进行。允许插入和删除元素的一端称为栈顶,另一端为栈底;栈底固定,栈顶浮动。栈的插入操作被形象地称为进栈或入栈,删除操作称为出栈或退栈。我们只能从一端取出放入数据,即压入栈和弹出栈,所以它的顺序是“后进先出”,如图1。 作者简介:刘碧霞(1993年-),女,本科,1063384634@https://www.360docs.net/doc/959758071.html,。 1.3 队列的概念和特性 队列与栈类似,是另一种限定性的线性表,它只允许在表的一端插入元素,而在另一端删除元素。允许插入元素的一端称为队尾,允许删除元素的一端称为队头。它的操作不同的地方是两端存、取数据,且仅仅是一端取(队头)一端存(队尾),所以它的顺序是“先进

相关文档
最新文档