天天看點

利用棧實作四則運算,帶負數,帶括号,帶小數

這利用棧實作四則運算,帶負數,帶括号,帶小數,自己寫的有問題大家糾正。

#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;

}

繼續閱讀