利用栈进行四则混合运算
2013-08-08 13:25
204 查看
#include <iostream>
using namespace std;
#include <string>
#define size2 10
#define size1 100
typedef int iii;
typedef struct
{
char *base;
char *top;
int size;
}stack2;
typedef struct
{
iii * base;
iii* top;
int size;
}stack;
void InitStack(stack2 &s)//初始化栈
{
s.base=(char*)malloc (size1*sizeof(char));
if(!s.base)
{
printf("超出界限\n");
return;
}
else
{
s.top=s.base;
s.size=size1;
}
}
void InitStack(stack &s)//初始化栈
{
s.base=(iii *)malloc (size1*sizeof(iii));
if(!s.base)
{
printf("超出界限\n");
return;
}
else
{
s.top=s.base;
s.size=size1;
}
}
void Insert(stack2 &s ,char a)//插入元素
{
if(s.top-s.base>=s.size)
{
s.base=(char *)realloc
(s.base,(s.size+size1)*sizeof (char));
if(!s.base)
{
printf("超出界限\n");
return
;
}
}
*s.top++=a;
}
void Insert2( stack &s,int a)
{
if(s.top-s.base>=s.size)
{
s.base=(iii *)realloc
(s.base,(s.size+size1)*sizeof (iii));
if(!s.base)
{
printf("超出界限\n");
return
;
}
}
*s.top++=a;
}
char Pop(stack2 &s )//删除栈顶元素,并返回栈顶元素
{
if(s.top==s.base)
{
printf("栈为空\n");
return 'erro';
}
else
{
*--s.top;
return * s.top;
}
}
int Pop2(stack &s)
{
if(s.top==s.base)
{
printf("栈为空\n");
return 'erro';//没意义
}
else
{
*--s.top;
return * s.top;
}
}
void View(stack &s)
{
for(int
i=1;i<=(s.top-s.base);i++)
{
char k;
k=*(s.top-i);
cout<<k<<endl;
}
}
char GetPop(stack2 &s)
{
if(s.top==s.base)
{
printf("栈为空\n");
return-1;
}
else
return *(s.top-1);
}
int GetPop2(stack &s)
{
if(s.top==s.base)
{
printf("栈为空\n");
return-1;
}
else
return *(s.top-1);
}
char Compare(char q,char r)//比较优先级
{
int j[2];
char str[2];
char table[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','e'},
{'>','>','>','>','e','>','>'},
{'<','<','<','<','<','e','='}
};
str[0]=q;
str[1]=r;
for(int i=0;i<2;i++)
{
switch(str[i])
{
case '+':j[i]=0;break;
case '-':j[i]=1;break;
case '*':j[i]=2;break;
case '/':j[i]=3;break;
case '(':j[i]=4;break;
case ')':j[i]=5;break;
case '#':j[i]=6;break;
}
}
return table[j[0]][j[1]];
}
int Operate (int a,char b,int c)
{
switch(b)
{
case '+':
return
a+c;
case '-':
return a-c;
case '*':
return a*c;
case '/':
return a/c;
}
}
bool Decide(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return true;
else
return false;
}
int main()
{
stack2 a;
stack b;//a存储符号,b存储数字
InitStack(a);
Insert(a,'#');
InitStack(b);
char c;
c=getchar();
int temp=0;
while (c!='#'||GetPop(a)!='#')
{
if(!Decide(c))
{
temp=(temp*10+c-'0');//可支持数位数字
c=getchar();
}
else if(Decide(c))
{
if(temp!=0)
{
Insert2(b,temp);
}
temp=0;
switch(Compare(GetPop(a),c))
{
case
'<':
//栈顶元素优先权低
//cout<<"<"<<endl;
Insert(a,c);
c=getchar();
break;
case
'=':
//脱括号
Pop(a);
c=getchar();
break;
case'>':
char
f=Pop(a);
int
g=Pop2(b);
int
h=Pop2(b);
Insert2(b,Operate(h,f,g));
break;
}
}
}
cout<<"结果为"<<endl;
cout<<GetPop2(b)<<endl;
return 0;
}
using namespace std;
#include <string>
#define size2 10
#define size1 100
typedef int iii;
typedef struct
{
char *base;
char *top;
int size;
}stack2;
typedef struct
{
iii * base;
iii* top;
int size;
}stack;
void InitStack(stack2 &s)//初始化栈
{
s.base=(char*)malloc (size1*sizeof(char));
if(!s.base)
{
printf("超出界限\n");
return;
}
else
{
s.top=s.base;
s.size=size1;
}
}
void InitStack(stack &s)//初始化栈
{
s.base=(iii *)malloc (size1*sizeof(iii));
if(!s.base)
{
printf("超出界限\n");
return;
}
else
{
s.top=s.base;
s.size=size1;
}
}
void Insert(stack2 &s ,char a)//插入元素
{
if(s.top-s.base>=s.size)
{
s.base=(char *)realloc
(s.base,(s.size+size1)*sizeof (char));
if(!s.base)
{
printf("超出界限\n");
return
;
}
}
*s.top++=a;
}
void Insert2( stack &s,int a)
{
if(s.top-s.base>=s.size)
{
s.base=(iii *)realloc
(s.base,(s.size+size1)*sizeof (iii));
if(!s.base)
{
printf("超出界限\n");
return
;
}
}
*s.top++=a;
}
char Pop(stack2 &s )//删除栈顶元素,并返回栈顶元素
{
if(s.top==s.base)
{
printf("栈为空\n");
return 'erro';
}
else
{
*--s.top;
return * s.top;
}
}
int Pop2(stack &s)
{
if(s.top==s.base)
{
printf("栈为空\n");
return 'erro';//没意义
}
else
{
*--s.top;
return * s.top;
}
}
void View(stack &s)
{
for(int
i=1;i<=(s.top-s.base);i++)
{
char k;
k=*(s.top-i);
cout<<k<<endl;
}
}
char GetPop(stack2 &s)
{
if(s.top==s.base)
{
printf("栈为空\n");
return-1;
}
else
return *(s.top-1);
}
int GetPop2(stack &s)
{
if(s.top==s.base)
{
printf("栈为空\n");
return-1;
}
else
return *(s.top-1);
}
char Compare(char q,char r)//比较优先级
{
int j[2];
char str[2];
char table[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','e'},
{'>','>','>','>','e','>','>'},
{'<','<','<','<','<','e','='}
};
str[0]=q;
str[1]=r;
for(int i=0;i<2;i++)
{
switch(str[i])
{
case '+':j[i]=0;break;
case '-':j[i]=1;break;
case '*':j[i]=2;break;
case '/':j[i]=3;break;
case '(':j[i]=4;break;
case ')':j[i]=5;break;
case '#':j[i]=6;break;
}
}
return table[j[0]][j[1]];
}
int Operate (int a,char b,int c)
{
switch(b)
{
case '+':
return
a+c;
case '-':
return a-c;
case '*':
return a*c;
case '/':
return a/c;
}
}
bool Decide(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return true;
else
return false;
}
int main()
{
stack2 a;
stack b;//a存储符号,b存储数字
InitStack(a);
Insert(a,'#');
InitStack(b);
char c;
c=getchar();
int temp=0;
while (c!='#'||GetPop(a)!='#')
{
if(!Decide(c))
{
temp=(temp*10+c-'0');//可支持数位数字
c=getchar();
}
else if(Decide(c))
{
if(temp!=0)
{
Insert2(b,temp);
}
temp=0;
switch(Compare(GetPop(a),c))
{
case
'<':
//栈顶元素优先权低
//cout<<"<"<<endl;
Insert(a,c);
c=getchar();
break;
case
'=':
//脱括号
Pop(a);
c=getchar();
break;
case'>':
char
f=Pop(a);
int
g=Pop2(b);
int
h=Pop2(b);
Insert2(b,Operate(h,f,g));
break;
}
}
}
cout<<"结果为"<<endl;
cout<<GetPop2(b)<<endl;
return 0;
}
相关文章推荐
- 利用java的swing控件实现四则混合运算计算器
- 利用栈ADT写了一个简单的四则混合运算
- 利用Python进行数据分析--数据聚合与分组运算1
- 利用XOR运算进行简单加密(C# 3.0完全参考手册)
- 四则混合运算类
- 利用System.Linq.Expressions实现四则运算计算器(二)
- 四则混合运算C++代码(中缀表达式)
- java 中使用BigDecimal进行数的四则运算
- 利用二进制数据的XOR(异或)运算进行加/解密(C#版)
- 中缀表达式生成二叉树并利用后缀表达式进行求值运算
- vs中利用openmp进行并行运算
- 一个逆波兰表达式实现的四则混合运算计算器
- JAVA实现简单四则混合运算
- 反向工程之四则混合运算优先级判断--加括号问题
- 带括号的四则混合运算的算符优先算法java实现
- python利用装饰器进行运算的实例分析
- 利用QT进行web与本地混合应用开发
- java的四则混合运算运算符的使用注意异同day02
- 第四次作业 结对编程 (四则混合运算)
- 利用C#动态编译功能实现像Javascript中的Eval的功能来将一段字符串进行数学运算