数据结构_用堆栈知识实现简单的多项式计算问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三程序源代码:
/*jisuanqi_head.h*/
/*2012年4月15日
made by liuhui*/
#define MAX 1000
struct save1
{
float n[MAX];
int top;
}stack1;
structsave2
{
char n[MAX];
int top;
}stack2;
说明几个函数:
bool stackempty(save1 s)用来判断操作数栈s是否为空。
void push(save1 &s,char e)若栈满则输出“栈已满”,否则将元素e入栈
void pop(save1 &s, char &e)若栈为空则输出“栈为空”,否则将栈顶元素赋给e
bool stackempty2(save2 s)用来判断运算符栈s是否为空。
{
cout<<"栈已满"<<endl;
return ;
}
s.top++;
s.n[s.top]=e;
}
void push2(save2 &s,char e)//将e入栈
{
if(s.top==MAX-1)
{
cout<<"栈已满"<<endl;
void pop(save1 &s,float &e);//将栈顶元素出栈,存到e中
void pop2(save2 &s,char &e);//将栈顶元素出栈,存到e中
int in(char e);//e在栈内的优先级别
int out(char e);//e在栈外的优先级别
void count(float a,char ope,float b);//进行计算并将计算结果入栈
void push2(save2 &s, char e)若运算符栈满则输出“栈已满”,否则将元素e入栈
void pop2(save2 &s, char &e)若栈为空则输出“栈为空”,否则将栈顶元素赋给e
int in(char e)返回运算符e在栈内的优先级别
int out(char e)返回运算符e在栈外的优先级别
/jisuanqi_main.cpp/
/*2012年4月15日
made by liuhui*/
#include<iostream>
#include<cmath>
#include<cstdlib>
#include"jisuanqi_head.h"
using namespace std;
bool stackempty(save1 s)//判断是否为空
3、若计算结果为整数,则输出整数,若含有小数,则输出浮点数。
二、概要设计
1、总体思路,先读入一行表达式,用一个字符数组存储。然后依次读每个字符,进行判断。边读入边进行计算。程序中用到了两个栈,一个字符栈以及一个数字栈,分别用来存储运算符和数字,根据运算符的优先顺序进行计算。最后输出结果。
2、程序包括几个模块,主函数和几个基本函数。
(2)若栈顶元素优先级高,
1)从符号栈弹出一个运算符,
2)从对象栈弹出一个/两个操作数,
3)运算结果压入对象栈。
(3)优先级相等,则栈顶元素出栈,与输入元素对消。
若“(、+、-、*、/、^”放在表达式最后面,则表达式错误
若“+、-、*、/、^”后面跟的不是数字或者变量,表达式错误
3、遇字母变量,则继续判断下一个字符,直到下一个字符不是字母变量,即可保证该变量是完整的,然后输出“请输入变量的值”,再将输入的变量值入操作数栈。
若变量后面跟的不是“+、-、*、/、^、)”,则表达式错误
4、若所读的该字符不是上述情况中的一种,则表达式错误
3、当将所有的字符都读一遍之后,若表达式正确的话,则必然不含有“(”或者“)”。即若运算符栈中含有“(”或者“)”,则表达式必错误。再考虑表达式正确的情况:运算符栈可能为空,则操作符栈中必剩下一个操作数,即最后的结果。若不为空,则留在运算符栈中的运算符的优先级别从栈顶至栈底依次递减。故可从运算符栈顶开始弹出一个运算符,从操作数栈中弹出两个操作数进行运算,再将运算结果入操作数栈,一直循环至运算符栈为空。此时操作数栈剩下的唯一一个操作数就是运算结果。
//stack1存储数字,stack2存储运算符号. ss
bool stackempty(save1 s);//判断是否为空
bool stackempty2(save2 s);//判断是否为空
void push(save1 &s,float e);//将e入栈
void push2(save2 &s,char e);//将e入栈
若数字不是表达式的最后一位,且数字后面跟的不是“+、-、*、/、^、)”,则为表达式错误
2.遇运算符,则分两种情况:
1、若运算符为负号(该运算符为符号的情况有两种:一为负号在最开头,一为符号前面是“(”),则先将0入操作数栈,然后再将负号入运算符栈。
2、该运算符不是负号则与运算符栈的栈顶元素比:
(1)若栈顶元素优先级低,新输入的运算符入栈。
{
if (s.top== -1)
return 1;
else
return 0;
}
bool stackempty2(sa Nhomakorabeae2 s)//判断是否为空
{
if (s.top== -1)
return 1;
else
return 0;
}
void push(save1 &s,float e)//将e入栈
{
if(s.top==MAX-1)
void count(char a,char ope, char b)将a、b进行相应的运算,并将运算结果入栈
3、具体操作步骤:
1、先读入一行表达式,用一个字符数组line[]存储
2、依次读入每个字符并进行处理同是进行表达式判错:
1.遇数字,则继续判断下一个字符,直到下一个字符不是数字且不是小数点,若该数含有两个小以上数点,则表示输入错误。否则即可保证该操作数是完整的浮点数,然后将该数入操作数栈。
用堆栈知识实现简单的多项式计算问题:
一、需求分析
1、功能:疏如一行表达式,若表达式有误,则输出“表达式有错”,否则计算出表达式的值并输出。运算符包括加、减、乘、除、乘方、一目减。括号均为小括号,但可以层层嵌套。操作数可以是浮点数,也包括有多个字母组成的变量。
2、输入的形式为表达式,按回车结束。输入值的范围不超过浮点数的范围。含有变量,变量名由字母组成,大小写不限。
/*jisuanqi_head.h*/
/*2012年4月15日
made by liuhui*/
#define MAX 1000
struct save1
{
float n[MAX];
int top;
}stack1;
structsave2
{
char n[MAX];
int top;
}stack2;
说明几个函数:
bool stackempty(save1 s)用来判断操作数栈s是否为空。
void push(save1 &s,char e)若栈满则输出“栈已满”,否则将元素e入栈
void pop(save1 &s, char &e)若栈为空则输出“栈为空”,否则将栈顶元素赋给e
bool stackempty2(save2 s)用来判断运算符栈s是否为空。
{
cout<<"栈已满"<<endl;
return ;
}
s.top++;
s.n[s.top]=e;
}
void push2(save2 &s,char e)//将e入栈
{
if(s.top==MAX-1)
{
cout<<"栈已满"<<endl;
void pop(save1 &s,float &e);//将栈顶元素出栈,存到e中
void pop2(save2 &s,char &e);//将栈顶元素出栈,存到e中
int in(char e);//e在栈内的优先级别
int out(char e);//e在栈外的优先级别
void count(float a,char ope,float b);//进行计算并将计算结果入栈
void push2(save2 &s, char e)若运算符栈满则输出“栈已满”,否则将元素e入栈
void pop2(save2 &s, char &e)若栈为空则输出“栈为空”,否则将栈顶元素赋给e
int in(char e)返回运算符e在栈内的优先级别
int out(char e)返回运算符e在栈外的优先级别
/jisuanqi_main.cpp/
/*2012年4月15日
made by liuhui*/
#include<iostream>
#include<cmath>
#include<cstdlib>
#include"jisuanqi_head.h"
using namespace std;
bool stackempty(save1 s)//判断是否为空
3、若计算结果为整数,则输出整数,若含有小数,则输出浮点数。
二、概要设计
1、总体思路,先读入一行表达式,用一个字符数组存储。然后依次读每个字符,进行判断。边读入边进行计算。程序中用到了两个栈,一个字符栈以及一个数字栈,分别用来存储运算符和数字,根据运算符的优先顺序进行计算。最后输出结果。
2、程序包括几个模块,主函数和几个基本函数。
(2)若栈顶元素优先级高,
1)从符号栈弹出一个运算符,
2)从对象栈弹出一个/两个操作数,
3)运算结果压入对象栈。
(3)优先级相等,则栈顶元素出栈,与输入元素对消。
若“(、+、-、*、/、^”放在表达式最后面,则表达式错误
若“+、-、*、/、^”后面跟的不是数字或者变量,表达式错误
3、遇字母变量,则继续判断下一个字符,直到下一个字符不是字母变量,即可保证该变量是完整的,然后输出“请输入变量的值”,再将输入的变量值入操作数栈。
若变量后面跟的不是“+、-、*、/、^、)”,则表达式错误
4、若所读的该字符不是上述情况中的一种,则表达式错误
3、当将所有的字符都读一遍之后,若表达式正确的话,则必然不含有“(”或者“)”。即若运算符栈中含有“(”或者“)”,则表达式必错误。再考虑表达式正确的情况:运算符栈可能为空,则操作符栈中必剩下一个操作数,即最后的结果。若不为空,则留在运算符栈中的运算符的优先级别从栈顶至栈底依次递减。故可从运算符栈顶开始弹出一个运算符,从操作数栈中弹出两个操作数进行运算,再将运算结果入操作数栈,一直循环至运算符栈为空。此时操作数栈剩下的唯一一个操作数就是运算结果。
//stack1存储数字,stack2存储运算符号. ss
bool stackempty(save1 s);//判断是否为空
bool stackempty2(save2 s);//判断是否为空
void push(save1 &s,float e);//将e入栈
void push2(save2 &s,char e);//将e入栈
若数字不是表达式的最后一位,且数字后面跟的不是“+、-、*、/、^、)”,则为表达式错误
2.遇运算符,则分两种情况:
1、若运算符为负号(该运算符为符号的情况有两种:一为负号在最开头,一为符号前面是“(”),则先将0入操作数栈,然后再将负号入运算符栈。
2、该运算符不是负号则与运算符栈的栈顶元素比:
(1)若栈顶元素优先级低,新输入的运算符入栈。
{
if (s.top== -1)
return 1;
else
return 0;
}
bool stackempty2(sa Nhomakorabeae2 s)//判断是否为空
{
if (s.top== -1)
return 1;
else
return 0;
}
void push(save1 &s,float e)//将e入栈
{
if(s.top==MAX-1)
void count(char a,char ope, char b)将a、b进行相应的运算,并将运算结果入栈
3、具体操作步骤:
1、先读入一行表达式,用一个字符数组line[]存储
2、依次读入每个字符并进行处理同是进行表达式判错:
1.遇数字,则继续判断下一个字符,直到下一个字符不是数字且不是小数点,若该数含有两个小以上数点,则表示输入错误。否则即可保证该操作数是完整的浮点数,然后将该数入操作数栈。
用堆栈知识实现简单的多项式计算问题:
一、需求分析
1、功能:疏如一行表达式,若表达式有误,则输出“表达式有错”,否则计算出表达式的值并输出。运算符包括加、减、乘、除、乘方、一目减。括号均为小括号,但可以层层嵌套。操作数可以是浮点数,也包括有多个字母组成的变量。
2、输入的形式为表达式,按回车结束。输入值的范围不超过浮点数的范围。含有变量,变量名由字母组成,大小写不限。