1. 程式人生 > >表示式求值(堆疊)

表示式求值(堆疊)

思路:

(1)建立兩個字元型的堆疊和一個浮點數的堆疊

(2)先輸入表示式,將表示式轉換為字尾表示式

(3)求出字尾表示式的結果

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
//存放字元的堆疊 
struct Node{
    char data;
    struct Node* next;
};
typedef struct Node* Stack;
char e;
void Init(Stack &s)
{
    s=NULL;
}
bool Empty(Stack &s) { return s==NULL; } void Push(Stack &s,char x) { Stack tmp=new Node; tmp->data=x; tmp->next=s; s=tmp; } void Pop(Stack &s) { Stack tmp=s; e=tmp->data; s=tmp->next; delete tmp; } char Top(Stack &s) { return s->data; }
//存放浮點數的堆疊 struct N{ double data; struct N* next; }; typedef struct N* STK; double e1; void Init1(STK &s) { s=NULL; } void Push1(STK &s,double x) { STK tmp=new N; tmp->data=x; tmp->next=s; s=tmp; } void Pop1(STK &s) { if(s==NULL) return ; STK tmp=s; e1
=tmp->data; s=tmp->next; delete tmp; } double Top1(STK &s) { return s->data; } bool Empty1(Stack &s) { return s==NULL; } void f() { Stack s1,s2; //從78-133是將中綴表示式轉換為字尾表示式 Init(s1);Init(s2); //s1記錄操作符,s2記錄數字 char str[120],a[120]; printf("請輸入一行不帶空格的,完整的,整數表示式(並且每個整數小於10):\n"); scanf("%s",str); int i,j,len=strlen(str); for(i=0;i<len;i++) { if(str[i]>='0'&&str[i]<='9') Push(s2,str[i]); else if(str[i]=='(') Push(s1,str[i]); else if(str[i]==')') { while(!Empty(s1)&&Top(s1)!='(') { Push(s2,Top(s1)); Pop(s1); } Pop(s1); } else if(str[i]=='-'||str[i]=='+') { if(Empty(s1)||Top(s1)=='(') Push(s1,str[i]); else { while(!Empty(s1)&&Top(s1)!='(') { Push(s2,Top(s1)); Pop(s1); } Push(s1,str[i]); } } else if(str[i]=='*'||str[i]=='/') { if(Empty(s1)||Top(s1)=='('||Top(s1)=='+'||Top(s1)=='-') Push(s1,str[i]); else { while(!Empty(s1)&&Top(s1)!='('&&Top(s1)!='+'&&Top(s1)!='-') { Push(s2,Top(s1)); Pop(s1); } Push(s1,str[i]); } } } while(!Empty(s1)) { Push(s2,Top(s1)); Pop(s1); } j=0; while(!Empty(s2)) //用a陣列儲存字尾表示式 { //cout<<Top(s2); a[j++]=Top(s2); Pop(s2); } //for(i=j-1;i>=0;i--) cout<<a[i]; //cout<<endl; //從138-154是將求出字尾表示式的結果 STK s3; Init1(s3); for(i=j-1;i>=0;i--) { if(a[i]>='0'&&a[i]<='9') Push1(s3,(double)(a[i]-'0')); else { double t1=Top1(s3); Pop1(s3); double t2=Top1(s3); Pop1(s3); //cout<<t1<<" "<<t2<<endl; if(a[i]=='+') Push1(s3,t1+t2); else if(a[i]=='-') Push1(s3,t2-t1); else if(a[i]=='*') Push1(s3,t1*t2); else if(a[i]=='/') Push1(s3,t2/t1); } } printf("%lf",Top1(s3)); } int main(void) { f(); return 0; } //測試資料:1+((2+3)*4)-5