知识大全 数据结构考研分类复习真题 第四章 答案[22]
Posted 常量
篇首语:少年辛苦终身事,莫向光阴惰寸功。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构考研分类复习真题 第四章 答案[22]相关的知识,希望对你有一定的参考价值。
[题目分析]本题是对字符串表达式的处理问题 首先定义 种数据结构 符号的类码 符号的TOKEN 表示 变量名表NAMEL和常量表CONSL 这四种数据结构均定义成结构体形式 数据部分用一维数组存储 同时用指针指出数据的个数 算法思想是从左到右扫描表达式 对读出的字符 先查出其符号类码 若是变量或常量 就到变量名表和常量表中去查是否已有 若无 则在相应表中增加之 并返回该字符在变量名表或常量表中的下标;若是操作符 则去查其符号类码 对读出的每个符号 均填写其TOKEN表 如此下去 直到表达式处理完毕 先定义各数据结构如下
struct //定义符号类别数据结构 char data[ ]; //符号 char code[ ]; //符号类码 TYPL; typedef struct //定义TOKEN的元素 int typ; //符号码 int addr; //变量 常量在名字表中的地址 cmp; struct cmp data[ ];//定义TOKEN表长度< int last; //表达式元素个数 TOKEN; struct char data[ ]; //设变量个数小于 个 int last; //名字表变量个数 NAMEL; struct char data[ ]; //设常量个数小于 个 int last; //常量个数 CONSL; int operator(char cr) //查符号在类码表中的序号 for(i= ;i<= ;i++) if(TYPL data[i]==cr) return(i); void PROCeString() //从键盘读入字符串表达式(以 # 结束) 输出其TOKEN表示 NAMEL last=CONSL last=TOKEN last= ; //各表元素个数初始化为 TYPL data[ ]= * ;TYPL data[ ]= + ;TYPL data[ ]= ( ; TYPL data[ ]= ) ; //将操作符存入数组 TYPL code[ ]= ;TYPL code[ ]= ;TYPL code[ ]= ; TYPL code[ ]= ; //将符号的类码存入数组 scanf( %c &ch); //从左到右扫描(读入)表达式 while(ch!= # ) // # 是表达式结束符 switch(ch)of case A : case B : case C : //ch是变量 TY= ; //变量类码为 for(i= ;i<=NAMEL last;i++) if(NAMEL data[i]==ch)break;//已有该变量 i记住其位置 if(i>NAMEL last)NAMEL data[i]=ch;NAMEL last++;//变量加入 case : case : case : case : case : case ://处理常量 case : case :case : case : TY= ;//常量类码为 for(i= ;i<=CONSL last;i++) if(CONSL data[i]==ch)break;////已有该常量 i记住其位置 if(i>CONSL last){CONSL data[i]=ch;CONSL last++;}//将新常量加入 default: //处理运算符 TY=operator(ch);//类码序号 i= \\ ; //填入TOKEN的addr域(期望输出空白) //结束switch 下面将ch填入TOKEN表 TOKEN data[++TOKEN last] typ=TY;TOKEN data[TOKEN last] addr=i; scanf( %c &ch); //读入表达式的下一符号 //while //算法结束
[程序讨论]为便于讨论 各一维数组下标均以 开始 在字符为变量或常量的情况下 将其类码用TY记下 用i记下其NAMEL表或CONSL表中的位置 以便在填TOKEN表时用 在运算符( + * ( ) )填入TOKEN表时 TOKEN表的addr域没意义 为了程序统一 这里填入了 \\ 本题是表达式处理的简化情况(只有 个单字母变量 常量只有 操作符只 个) 若是真实情况 所用数据结构要相应变化
cha138/Article/program/sjjg/201311/22605相关参考