這利用棧實作四則運算,帶負數,帶括号,帶小數,自己寫的有問題大家糾正。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct SNode PtrToSNode;
struct SNode {
char data[1001]; / 存儲元素的數組 /
int top; / 棧頂指針 /
};
typedef PtrToSNode list;
typedef struct Node PtrToSNode2;
struct Node {
double data[1001]; / 存儲元素的數組 /
int top; / 棧頂指針 /
};
typedef PtrToSNode2 list2;
void push(list s,char c){
s->data[++s->top]=c;
}
void push2(list2 s,double x){
s->data[++s->top]=x;
}
char pop(list s){
return s->data[s->top–];
}
double pop2(list2 s){
return s->data[s->top–];
}
double yun(char s){
double l;
char c;
double x1,x2;
int k=0;
double x;
int o=-1;
list q;
list2 p;
int flag=1;
q=(list)malloc(sizeof(struct SNode));
p=(list2)malloc(sizeof(struct Node));
q->top=-1;
p->top=-1;
while(s[k]!=’\0’){
if(s[k]>=‘0’&&s[k]<=‘9’){
push2(p,(double)(s[k]-‘0’));
k++;
while(s[k]>=‘0’&&s[k]<=‘9’){
push2(p,pop2§10+(double)(s[k]-‘0’));
k++;
}
}
else if(s[k]’.’){
k++;
x=0;
o=-1;
while(s[k]>=‘0’&&s[k]<=‘9’){
x=x+(s[k]-‘0’)*pow(10,o–);
k++;
}
push2(p,pop2§+x);
}
else if(s[k]’(’){
push(q,s[k]);
k++;
}
else if(s[k]’+’||s[k]’-’){
if(s[k-1]’+’||s[k-1]’-’||s[k-1]==’’||s[k-1]’/’||s[k-1]’(’){
if(s[k]’-’){
k++;
if(s[k]>=‘0’&&s[k]<=‘9’){
push2(p,(double)(s[k]-‘0’));
k++;
while(s[k]>=‘0’&&s[k]<=‘9’){
push2(p,pop2§*10+(double)(s[k]-‘0’));
k++;
}
}
if(s[k]!=’.’){
push2(p,-pop2§);
}
if(s[k]’.’){
k++;
x=0;
o=-1;
while(s[k]>=‘0’&&s[k]<=‘9’){
x=x+(s[k]-‘0’)pow(10,o–);
k++;
}
push2(p,-(pop2§+x));
}
}
else
k++;
}
else {
while(q->top!=-1&&q->data[q->top]!=’(’){
c=pop(q);
x2=pop2§;
x1=pop2§;
switch©{
case’+’:push2(p,x1+x2);break;
case’-’:push2(p,x1-x2);break;
case’’:push2(p,x1x2);break;
case’/’:push2(p,x1/x2);break;
}
}
push(q,s[k]);
k++;
}
}
else if(s[k]==’’||s[k]’/’){
while(q->data[q->top]’’||q->data[q->top]’/’){
c=pop(q);
x2=pop2§;
x1=pop2§;
switch©{
case’+’:push2(p,x1+x2);break;
case’-’:push2(p,x1-x2);break;
case’’:push2(p,x1x2);break;
case’/’:push2(p,x1/x2);break;
}
}
push(q,s[k]);
k++;
}
else if(s[k]’)’){
while(q->data[q->top]!=’(’){
c=pop(q);
x2=pop2§;
x1=pop2§;
switch©{
case’+’:push2(p,x1+x2);break;
case’-’:push2(p,x1-x2);break;
case’’:push2(p,x1x2);break;
case’/’:push2(p,x1/x2);break;
}
}
pop(q);
k++;
}
}
while(q->top!=-1){
c=pop(q);
x2=pop2§;
x1=pop2§;
switch©{
case’+’:push2(p,x1+x2);break;
case’-’:push2(p,x1-x2);break;
case’’:push2(p,x1x2);break;
case’/’:push2(p,x1/x2);break;
}
}
return pop2§;
}
int main(){
char a[100][100];
int i=0;
scanf("%s\n",a[i]);
i++;
i=0;
while(a[i][0]!=’=’){
scanf("%s",a[++i]);
}
double daan;
for(int j=0;j<i;j++){
daan=yun(a[j]);
printf("%.1f\n",daan);
}
return 0;
}