多项式求值的第一个方法的基本思路就是:设定两个栈,一个栈放数字,另一个栈放符号。
将表达式输入到字符数组中,
如果指针指向符号,并且该符号的优先级大于符号栈顶的优先级,那么就放进符号栈中;
如果指针指向的符号的优先级小于符号栈栈顶的优先级,那么将数字栈中pop出两个数字和符号栈中pop出的一个字符进行运算,将运算的结果放进数字栈中;
如果指针指向数字,那么就将数字放入数字栈中,再将指针指向下一个字符。
当字符数组全部输出完之后,就可以返回数字栈的栈顶元素了。
那么我们的头文件test就是栈的基本操作:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef char STDataType;
typedef struct Stack{
STDataType *a;
int top;
int capacity;
}ST;
void InitStack(ST*ps);//初始化
void PushStack(ST*ps,STDataType x);//入栈
void PopStack(ST*ps);//出栈
STDataType SatckTop(ST*ps);//返回栈顶元素
int StackEmpty(ST*ps);//判空
下面我们根据头文件写出对应的源文件中函数的声明:
#include"test.h"
void InitStack(ST*ps){
ps->a=(STDataType*)malloc(sizeof(STDataType)*4);
ps->top=0;//top指向栈顶元素的下一个位置
ps->capacity=4;
}
void PushStack(ST*ps,STDataType x){
assert(ps);
ps->a[ps->top++]=x;
if(ps->capcaity==ps->top){
STDataType*tmp=(STDataType*)realloc(ps->a,ps->capacity*2*sizeof(STDataType));
if(tmp==NULL)
exit(-1);
else{
ps->a=tmp;
ps->capcity*=2;
}
}
}
void PopStack(ST*ps){
assert(ps);
assert(ps->top>0);
ps->top--;
}
STDataType StackTop(ST*ps){
assert(ps);
assert(ps->top>0);
return ps->a[ps->top-1];
}
int StackEmpty(ST*ps){
assert(ps);
return ps->top?0:1;
}
下面我们来实现另一个源文件的操作:
#include"test.h"
int check(char s){//检查是否为运算符号
if(s=='+'||s=='-'||s=='*'||s=='/'||s=='('||s==')'||s=='#')
return 1;
return 0;
}
char Precede(char a,char b){//判断栈顶和字符元素的优先级
if(a=='+'){
switch(b){
case'+':return '>';
case'-':return '>';
case'*':return '<';
case'/':return '<';
case'(':return '<';
case')':return '>';
case'#':return '>';
}
}
else if(a=='-'){
switch(b){
case'+':return '>';
case'-':return '>';
case'*':return '<';
case'/':return '<';
case'(':return '<';
case')':return '>';
case'#':return '>';
}
}
else if(a=='*'){
switch(b){
case'+':return '<';
case'-':return '<';
case'*':return '>';
case'/':return '>';
case'(':return '<';
case')':return '>';
case'#':return '>';
}
}
else if(a=='/'){
switch(b){
case'+':return '<';
case'-':return '<';
case'*':return '>';
case'/':return '>';
case'(':return '<';
case')':return '>';
case'#':return '>';
}
}
else if(a=='('){
switch(b){
case'+':return '<';
case'-':return '<';
case'*':return '<';
case'/':return '<';
case'(':return '<';
case')':return '=';
case'#':return -1;
}
}
else if(a==')'){//按理说不会出现这种情况
switch(b){
case'+':return '>';
case'-':return '>';
case'*':return '>';
case'/':return '>';
case'(':return -1;
case'#':return '>';
}
}
else if(a=='#'){
switch(b){
case'+':return '<';
case'-':return '<';
case'*':return '<';
case'/':return '<';
case'(':return -1;
case')':return '<';
case'#':return '=';
}
}
return 0;
}
char cal(char a,char b,char c){
int m=a-'0';
int n=b-'0';
switch(c){
case'+':
return (m+n)+'0';
case'-':
return (m-n)+'0';
case'*':
return (m*n)+'0';
case'/':
return (m/n)+'0';
}
return 0;
}
int calculation(char*s){
ST ch,num;
char a,b,c;
InitStack(&ch);
InitStack(&num);
PushSatck(&ch,'#');
while(*s!='#'||StackTop(&ch)!='#'){
if(!check(*s)){
PushStack(&num,*s);
s++;
}
else{
switch(Precede(StackTop(&ch),*s)){
case'>':
char a=StackTop(&num);
PopStack(&num);
char b=StackTop(&num);
PopStack(&num);
char c=StackTop(&ch);
PopStack(&ch);
PushStack(&num,cal(a,b,c);
break;
case'<':
PushStack(&ch,*s);
s++;
break;
case'=':
PopStack(&ch);
s++;
break;
}
}
}
return StackTop(&num)-'0';
}
int main(){
char s[100]={0};//
printf("请输入表达式:");
scanf("%s",s);
int result=calculation(s);
printf("结果是:%d\n",result);
return 0;
}