继续温习数据结构...
实现用到了两个栈:操作数栈与操作符栈。
主要过程是将中序表达式转换为后续表达式,然后按顺序进行运算。
简单过程:1+8-7(中序) ---->18 7 - + (后序)--->11 + (运算8-7)---> 2 (运算1+1)
源码:
#include "stack.h" //利用到了前一篇文章实现的栈
#define SIZE 256
#define PSIZE 512
char postOrder[SIZE];
Stack<char> s(SIZE);
Stack<int> res(SIZE);
int prior(char ch) //自定义优先级
{
if(ch=='+'||ch=='-')return 2;
else if(ch=='*'||ch=='/')return 3;
else if(ch=='('||ch==')')return 4;
else if(ch=='=')return 1;
else return 0;
}
int comp(int i,int j,char c) //运算
{
switch(c)
{
case '+':
return i+j;
case '-':
return i-j;
case '*':
return i*j;
case '/':
return i/j;
default:
return -1;
}
}
int compute()
{
for(int i=0;i!=strlen(postOrder);)
{
if (postOrder[i]==' '||postOrder[i]==NULL||postOrder[i]=='=')
{
++i;
continue;
}
if (postOrder[i]>='0'&&postOrder[i]<='9'/*&&!res.isFull()*/)
{
int val=0; //计算操作数的大小
while(postOrder[i]>='0'&&postOrder[i]<='9')
{
val=10*val+(postOrder[i]-'0');
i++;
}
res.push(val);
continue;
}
if(res.top>=1)
{
int p=res.pop(); //取出离第一个操作符最近的两个操作数
int q=res.pop();
int s1=comp(q,p,postOrder[i]); //进行四则运算
res.push(s1);
++i;
}
}
return res.pop();
}
void change(char *prestr)
{
int i=0,j=0;
while(i<SIZE)
{
if (prestr[i]==' '||prestr[i]==NULL)
{i++;continue;}
if(prestr[i]>='0'&&prestr[i]<='9') //将字符串转换为表示后续表达式的字符数组
{
while(prestr[i]>='0'&&prestr[i]<='9')
{ //如果当前字符为数字,则继续
postOrder[j++]=prestr[i++];
}
postOrder[j++]=' ';
}
if(prestr[i]==')') //如果为右括号,则进行出栈操作,直到遇到左括号为止
{
int flag = 0;
while(!s.isEmpty())
{
if(s.data[s.top]=='(')
{
flag=1;
++i;
s.pop();
break;
}
postOrder[j++]=s.pop();
postOrder[j++]=' ';
}
if(s.isEmpty()&&flag==0)
{
cout<<"Error:Do you miss a '('?"<<endl;
exit(0);
}
}
if(prestr[i]!=')'&&!s.isFull()&&(s.isEmpty() //如果当前符号优先级大于栈顶符号优先级,则入栈
||prior(prestr[i])>prior(s.data[s.top])))
{
s.push(prestr[i++]);
}
else if(prestr[i]!=')')
{
while(!s.isEmpty()&&prior(prestr[i])<=prior(s.data[s.top])
&&s.data[s.top]!='(') //如果当前符号优先级比栈顶的小,则出栈,直到栈顶符号优先级
{ //小于等于当前符号优先级,然后入栈
postOrder[j++]=s.pop(); //记录出栈的元素
postOrder[j++]=' ';
}
s.push(prestr[i++]);
}
}
while(!s.isEmpty()) //遍历完字符串后,将还未出栈的元素全部出栈,记录在后续表达式的后面
{
if(s.data[s.top]=='(')
{
cout<<"Error:Do you miss a ')'?"<<endl;
exit(0);
}
postOrder[j++]=s.pop();
postOrder[j++]=' ';
}
}
int main()
{
char preStr[PSIZE];
char ch;
int preIndex=0;
memset(preStr,NULL,sizeof(preStr));
for(int i=0;i<PSIZE;++i)
{
ch=getchar();
if (ch==' '||ch==NULL)continue;
if(ch=='/n')break;
preStr[preIndex++]=ch;
if(ch=='=')break;
}
if(strlen(preStr)>SIZE)
{
cout<<"Exception:/nThe size of expression is beyond default value."
<<"/nThe length of a string cannot be larger than "<<SIZE<<"./n";
exit(0);
}
change(preStr);
for(int i=0;i<strlen(postOrder);++i)
{
cout<<postOrder[i];
}
cout<<endl;
for(int i=0;i!=strlen(preStr);++i)
{
cout<<preStr[i];
}
cout<<endl<<compute()<<endl;
return 0;
}
分享到:
相关推荐
四则运算实现(c 语言 数据结构课程设计题
c语言数据结构栈的四则运算(带括号)的实现,里面有解释
c++高精度四则运算实现。。。。。。。。。。。。。。。
很好的程序,供大家参考。大家多提意见哈。我们共同学习
【问题描述】 由键盘输入两个整数,分别计算这两个数的和、差、积、商,并输出结果。 【输入形式】 所输入的两个整数用逗号分隔 【输出形式】 ...输出4行数据,自上而下每行分别为两个数的和、差、积、商的结果 ...
四则运算实现(c 语言 数据结构课程设计题) #include <stdio.h> #include <malloc.h> #include <math.h> #include <string.h> #include <ctype.h> #define M 40
用C语言实现四则运算,包括加减乘除以及括号,输入一个正确的算术表达式可正确输出结果,具体的实现思路是将算术表达式按序输入一个栈中,然后根据括号的位置以及左右半括号属性来判断运算顺序
数据结构c++长整数四则运算实现
基于模板类,栈的简单四则运算C++实现,基于模板类,栈的简单四则运算C++实现,基于模板类,栈的简单四则运算C++实现,基于模板类,栈的简单四则运算C++实现,
java实现四则运算,将中缀表达式变成后缀表达式,使用栈来做最后的运算
计算器类: 设计一个计算器类模板,适用各类型表达式的“+、-、×、/” 数学四则运算以及“>、>=、<、、!=、==”等关系运算。数学四则运算表达式中可含有加、减、乘、除运算符以及各型数据的运算对象。程序可以直接...
小学生四则运算实现,c语言编写。 实现小学生加法、减法、乘法和除法运算。 并选择难易度,简单运算和混合运算,具有界面选择功能。
按照IEEE754浮点数标准,完整的浮点数加乘除四则运算的程序,每个都是单独的一个文件,注释完整。编译仿真全通过!
使用ASP.NET技术设计一小学生整数四则运算网站,能让学生自己注册、登陆,并且记录学生每次测试的成绩与测试题及学生答案与正确答案,并且显示学生成绩的排名。(测试题目可由程序自动生成,要求可生成多种运算符号...
使用c语言,实现带括号的四则运算的程序(使用Visual Studio的完整程序 )
用c++模板类实现矩阵的四则运算,其中乘法和除法为点乘和点除运算,即相应元素的运算
大数四则运算的C++实现,大数四则运算包括加减乘除的运算,使用链表实现。
博客配套文件,利用c++ STL容器栈和队列实现四则运算,支持优先级和括号运算。
用汇编语言写成的带符号四则运算,有提示信息,也能将运算结果显示出。
功能要求: 1. 显示菜单,要求用户从菜单中选择具体的练习项目,例如选择“加法练习”, 则由计算机...我写的这个小学生四则运算系统代码可读性非常好,思维清晰易懂,有需要的小伙伴抓紧下载吧,绝对不会让你失望滴!