问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

算符优先分析法

发布网友 发布时间:2022-05-01 02:17

我来回答

1个回答

热心网友 时间:2022-06-22 09:35

////////////////////////////////////算符优先分析//////////////////////////////
#include <iostream>
#include <string>
using namespace std;

#define MAX 30//栈容量
#define INPUTMAX 60//键盘接收字符允许的最大个数

int F( char );//进栈优先函数
int G( char );//比较优先函数
//函数重载Push、Pop
void Push( int );//Stack1进栈函数
void Push( char );//Stack2进栈函数
int Pop( int );//Stack1出栈函数
void Pop( char );//Stack2出栈函数

int Stack1[MAX];//操作数栈
int m;//栈Stack1指针

char Stack2[MAX];//运算符栈
int n;//栈Stack2指针

void main()
{
int i = 1;//键盘接收字符定位
m = 0;//栈指针初始化
n = 0;//栈指针初始化
char ch[INPUTMAX];//定义接收字符数组
cout << "请输入符号串(括在两个#之间):" << endl;
cin >> ch;
int len = strlen( ch );//统计字符长度

if( ch[0] != '#' || ch[len-1] != '#' )
cout << "符号串必须在两个#之间!" << endl;
else
{
cout << "///////////////////" << endl;
cout << "Stack1为操作数栈!" << endl;
cout << "Stack2为运算符栈!" << endl;
cout << "///////////////////" << endl;
cout << "栈操作如下:" << endl;
cout << "///////////////////" << endl;

Push( ch[0] );//将字符串首字符压进栈
cout << "Stack2: " << Stack2[0] << "进栈!" << endl;

while(i < len)
{
if( ch[i] >= '0' && ch[i] <= '9' )//判断位数
{
int value = 0;
while( ch[i] >= '0' && ch[i] <= '9' )//字符数字串转换为十进制数
{
value = value * 10;
value = value + (ch[i]-48);
i++;
}
Push( value );//将最终的数字压入栈
cout << "Stack1: " << value << "进栈!" << endl;
}
else
{
if( F(Stack2[n-1]) <= G(ch[i]) )//当前字符优先级小于下一字符优先级则把下一字符压进栈
{
jmp: Push( ch[i] );
cout << "Stack2: " << Stack2[n-1] << "进栈!" << endl;
}
else//当前字符优先级小于下一字符优先级
{
int j;
for(j = n-1;j >= 1;j--)//循环处理栈Stack2字符
{
if(Stack2[j] == '+')//栈顶运算符为'+'则执行加法运算
{
int t1,t2,t3;
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;//将操作数栈顶上的两个操作数做出栈处理
t1 = Pop( Stack1[m-1] );
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;
t2 = Pop( Stack1[m-1] );
t3 = t1 + t2;//根据运算符栈顶的运算符运算
Push( t3 );//将运算结果压进操作数栈
cout << "Stack1: " << Stack1[m-1] << "进栈!" << endl;
cout << "Stack2: " << Stack2[j] << "出栈!" << endl;
Pop( Stack2[j] );//将运算符栈顶的运算符做出栈处理
if( F(Stack2[j-1]) <= G(ch[i]) )//若栈内下一字符优先级小于字符串字符优先级则跳至jmp将其压栈同时跳出此循环否则出错
goto jmp;
}
else if(Stack2[j] == '-')//栈顶运算符为'-'则执行减法运算
{
int t1,t2,t3;
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;//将操作数栈顶上的两个操作数做出栈处理
t1 = Pop( Stack1[m-1] );
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;
t2 = Pop( Stack1[m-1] );
t3 = t2 - t1;//根据运算符栈顶的运算符运算
Push( t3 );//将运算结果压进操作数栈
cout << "Stack1: " << Stack1[m-1] << "进栈!" << endl;
cout << "Stack2: " << Stack2[j] << "出栈!" << endl;
Pop( Stack2[j] );//将运算符栈顶的运算符做出栈处理
if( F(Stack2[j-1]) <= G(ch[i]) )//若栈内下一字符优先级小于字符串字符优先级则跳至jmp将其压栈同时跳出此循环否则出错
goto jmp;
}
else if(Stack2[j] == '*')//栈顶运算符为'*'则执行乘法运算
{
int t1,t2,t3;
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;//将操作数栈顶上的两个操作数做出栈处理
t1 = Pop( Stack1[m-1] );
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;
t2 = Pop( Stack1[m-1] );
t3 = t1 * t2;//根据运算符栈顶的运算符运算
Push( t3 );//将运算结果压进操作数栈
cout << "Stack1: " << Stack1[m-1] << "进栈!" << endl;
cout << "Stack2: " << Stack2[j] << "出栈!" << endl;
Pop( Stack2[j] );//将运算符栈顶的运算符做出栈处理
if( F(Stack2[j-1]) <= G(ch[i]) )//若栈内下一字符优先级小于字符串字符优先级则跳至jmp将其压栈同时跳出此循环否则出错
goto jmp;
}
else if(Stack2[j] == '/')//栈顶运算符为'/'则执行除法运算
{
int t1,t2,t3;
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;//将操作数栈顶上的两个操作数做出栈处理
t1 = Pop( Stack1[m-1] );
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;
t2 = Pop( Stack1[m-1] );
t3 = t2 / t1;//根据运算符栈顶的运算符运算
Push( t3 );//将运算结果压进操作数栈
cout << "Stack1: " << Stack1[m-1] << "进栈!" << endl;
cout << "Stack2: " << Stack2[j] << "出栈!" << endl;
Pop( Stack2[j] );//将运算符栈顶的运算符做出栈处理
if( F(Stack2[j-1]) <= G(ch[i]) )//若栈内下一字符优先级小于字符串字符优先级则跳至jmp将其压栈同时跳出此循环否则出错
goto jmp;
}
else if(Stack2[j] == '^')//栈顶运算符为'^'则执行幂运算
{
int t1,t2,t3 = 1;
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;//将操作数栈顶上的两个操作数做出栈处理
t1 = Pop( Stack1[m-1] );
cout << "Stack1: " << Stack1[m-1] << "出栈!" << endl;
t2 = Pop( Stack1[m-1] );
for( int t = 0;t < t1;t++)//根据运算符栈顶的运算符运算
t3 = t3 * t2;
Push( t3 );//将运算结果压进操作数栈
cout << "Stack1: " << Stack1[m-1] << "进栈!" << endl;
cout << "Stack2: " << Stack2[j] << "出栈!" << endl;
Pop( Stack2[j] );//将运算符栈顶的运算符做出栈处理
if( F(Stack2[j-1]) <= G(ch[i]) )//若栈内下一字符优先级小于字符串字符优先级则跳至jmp将其压栈同时跳出此循环否则出错
goto jmp;
}
else
{
cout << "Stack2: " << Stack2[j] << "出栈!" << endl;
Pop( Stack2[j] );
}
}
Push( ch[i] );//将字符串最后的字符压进栈
cout << "Stack2: " << ch[i] << "进栈!" << endl;
}
i++;//读下一字符继续循环
}
}
cout << "///////////////////" << endl;
if(Stack2[0] == Stack2[1])//若栈尾的最后两个字符都为#则分析成功
{
cout << "算符优先分析成功!" << endl;
cout << "///////////////////" << endl;
cout << "运算结果:" << Stack1[m-1] << endl;//根据算符优先将结果输出
cout << "///////////////////" << endl;
}
else
cout << "算符优先分析失败!" << endl;
}
}

int F( char ch )//进栈优先函数
{
if( ch == ')' )
return 9;
else if( ch == '^' )
return 7;
else if( ch == '*' || ch == '/' )
return 5;
else if( ch == '+' || ch == '-' )
return 3;
else if( ch == '(' )
return 1;
else
return 0;
}

int G( char ch )//比较优先函数
{
if( ch == ')' )
return 1;
else if( ch == '^' )
return 6;
else if( ch == '*' || ch == '/' )
return 4;
else if( ch == '+' || ch == '-' )
return 2;
else if( ch == '(' )
return 8;
else
return 0;
}

void Push( int num )
{
if( m >= MAX )//m大于MAX时栈满
cout << "栈满!" << endl;
else
Stack1[m++] = num;//压栈后栈序号加1
}

void Push( char ch )
{
if( n >= MAX )//n大于MAX时栈满
cout << "栈满!" << endl;
else
Stack2[n++] = ch;//压栈后栈序号加1
}

int Pop( int num )
{
if( m <= 0 )//m小于零时栈空
cout << "栈空!" << endl;
else
num = Stack1[--m];//出栈后栈序号减1
return num;
}

void Pop( char ch )
{
if( n <= 0 )//n小于零时栈空
cout << "栈空!" << endl;
else
ch = Stack2[--n];//出栈后栈序号减1
}

参考资料:http://zhidao.baidu.com/question/55305509.html?si=2&wtp=wk

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
折儿是什么意思? 什么叫饭折? 饭折是什么意思 私募股权基金6种模式 私募投资业务管理系统 火山仙泉天然矿泉水产品特点 用苏打片带吃带洗真的能生男孩吗 凡山天然苏打水怎么样 美的面包机和面要多久 美的面包机和面的时间要多长 美的面包机怎么用手动操作 简述简单优先分析法和算符优先分析法归约过程有什么区别 编译原理5:算符优先关系表构造 简述算符优先归约和规范规约的区别 什么是算符优先文法 什么是算符优先文法? word2007中背景预览正常,打印出来是平铺 优先算符和逻辑与的基本作用 蚂蚁庄园25点荣耀值能存多少饲料 蚂蚁庄园怎么捐献一个鸡蛋 Word2007插入背景如何平铺这张纸 蚂蚁庄园我存五十个鸡蛋不捐会不会没了? 蚂蚁庄园一次性捐25个蛋就可以升级仓库吗? 蚂蚁庄园5668g饲料是几个蛋 蚂蚁庄园蛋不收可以存多少个 楼下用油烟机楼上油烟机管动 为什么楼上人家一炒菜,我家的抽油盐机就嗡嗡作响 我家住二楼,只要一楼开了抽油烟机我家的油焑也会响,是什么原因? 楼上做饭开油烟机楼下烟筒振动有油烟味是怎么回事? 请问楼上的人只要开油烟机,楼下的油烟机就会发出嗡嗡的声响,这是怎么回事?是油烟机还是烟道问题? 给我推荐一款真正免费好用的网络电话,我在加拿大,想往中国打 算符优先分析法的算符文法 请问什么是算符优先文法(编译原理)? 使用算符优先分析法分析的语言,应具有什么特点 算符优先分析怎么判断非终结符和终结符之间的优先级 简单优先和算符优先的异同 编译原理算符优先分析法中构造分析表的时候,井号和其他符号的优先级怎么判断?在线等。 如何构造算符优先表 【编译原理】在算符优先分析中,栈顶元素可以是终结符,非终结符和#号三种,这三种分别对应什么操作? 算符优先分析法的构造LastVT集的算法 周公解梦梦见自己从监狱逃出 梦见从一所监狱里逃出来,但怎么跑都是监狱的管辖内? 梦见自己和一个女人从监狱里逃出来,后来在路上遇到了十辆警车接亲 如果我的会员今天到期。我没有续费。明天再续费,会怎么样? 全家会员续费自己手机上可以操作吗? app到期没有续费怎么办 如果在会员没有到期时续费,是按续费的时候算起,还是等这个到期再算续费的? 办理超级会员全家桶后,合约期有效期是怎么计算的? 会员到期了如果不及时续费它可以延续几天后会取消掉会员? 怎么补办便利店全家的会员卡? 超级会员全家桶合约有效期怎么计算?