正文.doc

Similar documents
Microsoft PowerPoint - ch3.pptx

C C

C 1

C/C++语言 - C/C++数据

untitled

新・解きながら学ぶC言語

C/C++ - 字符输入输出和字符确认

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

新・明解C言語入門編『索引』

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

PowerPoint Presentation

CC213

新版 明解C言語入門編

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C/C++语言 - 分支结构

C/C++ - 文件IO

chap07.key

3.1 num = 3 ch = 'C' 2

C/C++ - 函数

epub 33-8

FY.DOC

Microsoft Word - administrative-law-08.doc

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

C/C++语言 - 运算符、表达式和语句

月光迴旋曲

untitled

新版 明解C++入門編

C/C++ 语言 - 循环

4

C

新・解きながら学ぶJava

Microsoft Word - 第3章.doc

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

C语言的应用.PDF

第一章

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

c_cpp

CHAPTER VC#

untitled

untitled

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

untitled


【主持人】:给大家介绍一下,这次的培训是我们画刊部的第三次培训,当然今天特别有幸请来著吊的摄影家李少白老师给我们讲课

PowerPoint 簡報

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

ex

nooog

40 第二部分试题部分 9. 假设栈初始为空, 将中缀表达式 a/b+(c*d-e*f)/g 转换为等价的后缀表达式的过程中, 当扫描 到 f 时, 栈中的元素依次是 ( ) 2014 年全国试题 2(2) 分 A. +(*- B. +(-* C. /+(*-* D. /+-* 10. 循环队列存放

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

今天 年春季号 总 92 期

*

( ) / / / / / / /

(Microsoft Word - 8\244T\244\362\277\337\272]\244W\265L\246W.doc)

Microsoft Word - 專家本色 doc

但, 你 应 该 听 过 我 们 走 在 大 路 上 这 首 歌, 或 许 还 知 道 革 命 人 永 远 是 年 轻 那 支 歌 ; 并 且, 几 乎 可 以 肯 定, 你 在 戴 红 领 巾 的 那 阵, 必 然 唱 过 牛 儿 还 在 山 坡 吃 草, 放 牛 的 却 不 知 道 哪 儿 去

2 临 终 助 念 答 问 序 临 终 关 怀, 由 佛 门 净 宗 古 来 祖 师 大 德 提 倡 助 念 往 生, 现 今 已 渐 为 社 会 大 众 所 重 视, 在 台 湾, 台 大 长 庚 等 各 大 医 院, 也 都 设 有 助 念 室 ; 大 陆 上 许 多 道 场, 也 有 专 为

校园之星

Microsoft Word - 澎湖田調報告-宏達組9804.doc

<4D F736F F F696E74202D FA8BEA861B8EAB7BDBEE3A658BB50C0B3A5CE28B773A6CBA5AB29>

之 原 則 及 國 防 部 訂 頒 國 軍 列 管 國 有 不 動 產 提 供 非 軍 方 單 位 使 用 處 理 原 則 規 定 不 符, 仍 應 以 出 租 方 式 辦 理 惟 可 就 偏 遠 地 區 提 供 官 兵 金 融 水 電 服 務 使 用 部 分, 研 議 降 低 租 金 標 準, 報

釋禪波羅蜜次第法門

1700 装 卸 搬 运 7645 装 卸 搬 运 服 务 2100 建 筑 7410 工 程 服 务 11% 装 卸 搬 运 服 务, 是 指 使 用 装 卸 搬 运 工 具 或 者 人 力 畜 力 将 货 物 在 运 输 工 具 之 间 装 卸 现 场 之 间 或 者 运 输 工 具 与 装 卸

《盗墓笔记》 南派三叔/著

平 凡 足 迹 李 本 川 作 者 为 中 国 科 学 院 海 洋 研 究 所 研 究 员,1935 年 生, 山 东 荣 成 人 我 今 年 63 岁 了 大 前 年 丈 夫 和 儿 子 在 一 个 月 内 先 后 离 开 了 人 世, 女 儿 又 已 出 嫁, 现 在 是 孑 然 一 身 我 是


1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Ps22Pdf

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

untitled

汇集全球21位医生的经验和智慧,总结出最实用的专业建议,这些都是最值得你牢记的健康提醒

1 行 业 发 展 不 平 衡 我 国 房 地 产 中 介 服 务 业 起 步 较 晚, 专 业 分 工 程 度 和 国 外 发 达 国 家 相 比 还 有 很 大 差 距 房 地 产 中 介 服 务 行 业 的 发 展 水 平 与 房 地 产 开 发 行 业 的 市 场 化 水 平 密 切 相 关

4 25,887,432 24,017,720 (22,276,482) (20,881,677) 3,610,950 3,136, ,415,375 2,280, , ,517 (4,973,881) (4,558,202) (646,824) (560,1

<4D F736F F D20A5F1A4FBA473A6DBA662C149AE76BB50B0A8AFAAB944A440AC78A67BA976C149BEC7ABE4B751AABAB56FAE692E646F63>


Microsoft PowerPoint - 4.pptx

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

Guava学习之Resources

ebook39-5

Transcription:

第 3 章 栈 实验三 3.1 实验目的及要求 1. 理解特殊的线性结构 顺序栈的抽象数据类型的定义, 及其在 C 语言环境中的表示方法 2. 理解顺序栈的基本操作的算法, 及其在 C 语言环境中一些主要基本操作的实现 3. 在 C 语言环境下实现顺序栈的应用操作 : 1 利用栈实现十进制数转换成八进制数 2 利用栈实现一位数的加减乘除的表达式求解 3.2 实验内容 经过对实验目的及要求的分析, 本实验仍然采用首先描述栈的基本操作集函数, 然后分别在两个应用操作中使用基本操作集函数来实现 由于栈是一种特殊的线性结构, 仅在栈顶进行插入和删除操作, 即栈具有后进先出的特点, 故其操作比一般的线性表更为容易, 所以在本实验中有关栈的基本操作集的实现都比较简单, 没有做过多的说明, 而是在数制转换和表达式求解的应用操作中加入了更多的编程技巧, 使读者通过本实验不仅了解栈这种特殊结构的线性表, 而且掌握利用栈可实现很多的应用, 尤其是在实现表达式求解时用到了两个顺序栈, 并且加入了运算符的优先关系的判断等, 实现稍有难度 在程序 Stack.c 中, 只包含了数制转换和一位数的表达式求解, 多位数的表达式求解思想与一位数表达式求解思想一致, 但需要添加多位数的接收处理, 请读者自行编写代码 程序名为 :Stack.c 在 Stack.c 中包含的函数如图 3.1 所示

28 数据结构算法设计与实现指导 (C 语言版 ) 图 3.1 Stack.c 中包含的函数一览表 3.3 功能函数的分析设计及源代码 本部分列出了实现顺序栈的操作的源代码, 并在适当的位置上添加了一些文字和流程 图的注释, 帮助读者理解顺序存储的栈的存储结构及操作算法 文件名 :Stack.c #include "alloc.h" #include "stdio.h" #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int SElemType; typedef int Status; // 定义顺序栈的结构 typedef struct SqStack 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);

第 3 章栈 实验三 29 (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; // 数据元素入栈 Status 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; // 数据元素出栈 Status Pop(SqStack *S,SElemType *e) if((*s).top==(*s).base) return ERROR; *e=*--(*s).top; // 判断一个栈是否为空 Status StackEmpty(SqStack S) if(s.top==s.base) return TRUE; return FALSE; // 销毁一个栈 Status DestroyStack(SqStack *S) free((*s).base); (*S).base=NULL; (*S).top=NULL; (*S).stacksize=0; // 十进制数转换成八进制 本函数实现了无符号十进制数和八进制数间的转换功能 如输入的是负数, 由于系统使用补码表示负数, 会自动将其进行补码转换, 再通过本

30 数据结构算法设计与实现指导 (C 语言版 ) 函数对其实现八进制转换 如, 当输入 -1 时, 结果显示 65535 如果需要将十进制转换成十六进制应该如何修改本函数? 方法有两种, 第一种, 在入 栈时, 存入十六进制数 ; 第二种, 在出栈时, 输出十六进制数 请读者自己编写代码 void conversion() SqStack s; unsigned n; SElemType e; InitStack(&s); printf("please input a decimal number:"); scanf("%u",&n); while(n) Push(&s,n%8); n=n/8; printf("the corresponding octal number is:"); while(!stackempty(s)) Pop(&s,&e); printf("%d",e); printf("\n"); DestroyStack(&s); // 取栈顶的数据元素 Status GetTop(SqStack S,SElemType *e) if(s.top>s.base) *e=*(s.top-1); return ERROR; // 按照四则运算法则定义的运算符 ( 包括 :+ - * / () #) 运算的优先关系, 即按照表 3.1 // 判断输入的运算符与运算符栈中的运算符的优先关系 表 3.1 的运算符间的优先关系是按照四则运算法则定义的, 也就是本函数的运行结果 如果读者希望在运算中再加入其他运算符 ( 如乘方等 ), 则必须先定义它们的关系, 丰富表 3.1 的内容, 同时在函数中添加所加入的运算符的比较内容 其中 θ 1 为栈顶元素,θ 2 为输 入元素 定义 # 运算符为输入表达式时的结束符及存放运算符的栈的栈底元素 本函数不包含任何数据结构的内容, 仅是在输入表达式的过程中, 按照表 3.1 判断运 算符栈的栈顶元素与输入的运算符的关系 (< > =) 因一个表达式包含多个运算符, 故将此部分作为一个独立的函数进行编写

第 3 章栈 实验三 31 表 3.1 运算符间的优先关系 θ 1 θ 2 + - * / ( ) # + > > < < < > > - > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < = SElemType Precede(SElemType t1,selemtype t2) SElemType f; switch(t2) case '+': case '-':if(t1=='(' t1=='#') f='<'; f='>'; case '*': case '/':if(t1=='*' t1=='/' t1==')') f='>'; f='<'; case '(':if(t1==')') printf("input Error\n"); exit(error); f='<'; case ')':switch(t1) case '(':f='='; case '#':printf("input ERROR\n"); exit(error); default: f='>'; case '#':switch(t1) case '#':f='=';

32 数据结构算法设计与实现指导 (C 语言版 ) case '(':printf("input Error\n"); exit(error); default: f='>'; return f; // 判断 c 是否为运算符 ( 运算符包括 :+ - * / () #) Status In(SElemType c) switch(c) case'+': case'-': case'*': case'/': case'(': case')': case'#':return TRUE; default:return FALSE; // 计算 a 和 b, 返回运算结果 SElemType Operate(SElemType a,selemtype theta,selemtype b) SElemType c; switch(theta) case'+':c=a+b; case'-':c=a-b; case'*':c=a*b; case'/':c=a/b; return c; // 表达式求解 在栈的基本操作集中, 主要就是入栈和出栈操作, 而且栈的数据元素的特点是后进先 出, 表达式求解的应用正是利用栈的这个特性 结果等 在对这个应用进行分析时, 设计了中间函数, 如算符优先级别判断, 计算每次运算的 在这个函数中定义了两个栈, 一个栈用来存放操作数, 另一个栈用来存放运算符, 由 此又设计了对输入字符的判断函数 这样就使得表达式求解的函数更直观 简单 易理解 该函数处理过程有一定难度, 其流程图如图 3.2 所示

第 3 章栈 实验三 33 图 3.2 表达式求解的流程图 SElemType EvaluateExpression(SElemType *e) SqStack OPTR,OPND; SElemType a,b,c,x,theta; InitStack(&OPTR); Push(&OPTR,'#'); InitStack(&OPND); c=getchar();

34 数据结构算法设计与实现指导 (C 语言版 ) GetTop(OPTR,&x); while(c!='#' x!='#') if(in(c)) switch(precede(x,c)) case'<':push(&optr,c); c=getchar(); case'=':pop(&optr,&x); c=getchar(); case'>':pop(&optr,&theta); Pop(&OPND,&b); Pop(&OPND,&a); Push(&OPND,Operate(a,theta,b)); if(c>='0'&&c<='9') Push(&OPND,c-48); c=getchar(); printf("input Error\n"); return ERROR; GetTop(OPTR,&x); GetTop(OPND,&x); *e=x; // 主函数 本实验实现两个功能, 一是十进制转换成八进制, 二是实现 10 以内个位数字的加 减 乘 除运算 main() char chs[256],ch; SElemType e=0; clrscr(); printf("\n1:decimal-octal Conversion"); printf("\n2:numeric Expression Evaluator"); printf("\n0:exit\n"); printf("\ninput function select:"); gets(chs);

第 3 章栈 实验三 35 while (1) if (strlen(chs)==1) ch=chs[0]; switch (ch) case '1':conversion(); case '2':printf("Input expression ended by '#'.\n"); printf("(notice: Operand should be 0-9):"); if(evaluateexpression(&e)) printf("%d\n",e); case '0': default: printf("\nbad input...\n"); printf("\nbad input...\n"); printf("\ncontinue input function select:"); fflush(stdin); gets(chs); 3.4 习题 1. 验证栈顺序存储时的基本操作集函数和利用基本操作集实现十进制和八进制转换 一位数的加减乘除的表达式求解功能 2. 在主函数中编写代码实现十进制和八进制转换功能 3. 在主函数中编写代码实现一位数表达式求解功能