1. 程式人生 > >資料結構實驗(C++)之桟(1)

資料結構實驗(C++)之桟(1)

(1)設計一個演算法,將一般算術表示式轉化為逆波蘭表示式,並求逆波蘭表示式的值。

程式碼:

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
const int StackSize=50;


int Compare(char op) {
if(op=='(') return 1;
if(op==')') return 1;
if(op=='*') return 7;
if(op=='/') return 7;
if(op=='+') return 4;
if(op=='-') return 4;
if(op=='^') return 9;
if(op=='#') return 0;
}


template <class T>
class SeqStack
{
public:
SeqStack() {
top=-1;
}
~SeqStack() {
}
void Push(T x);
void ChangeStack(T a[],int n,T *c);
T Pop();
T GetTop() {
if(top!=-1) return data[top];
}
int Empty() {
returntop==-1 ?  1 :  0;
}
private:
T data[StackSize];
int top;
 };
 
 template <class T>
 void SeqStack<T>::Push(T x)
 {
 if(top==StackSize-1) throw "上溢";
data[++top]=x; 
 }
 
 template <class T>
 T SeqStack<T>::Pop()
 {
 T x;
 if(top==-1)throw"下溢";
 x=data[top--];
 return x;
 }
 
template <class T>
T Computer(T a,T b,char c)
{
T temp;
switch(c)
{
case '+':
temp=a+b;
break;
case '-':
temp=a-b;
break;
case '*':
temp=a*b;
break;
case '/':
temp=a/b;
break;
case '^':
{
T i=0;
temp=1;
while(fabs(i-b)>1e-6)
{
temp*=a;
i++;
}


}
break; 
}
return temp;
}
 
 template <class T>
 void SeqStack<T>::ChangeStack(T a[],int n,T *c)
 {
 int j=0;
 bool flag=false;
 SeqStack<char> optr;
 optr.Push('#');
 for(int i=0;i<n;i++) {
 if( a[i]=='#' ) {
 if(flag==true) {
 while(!optr.Empty() && optr.GetTop()!='#') {
c[j++]=optr.Pop();
c[j++]=' ';
}
 c[j++]=a[i];
c[j]='\0';
break;
}
 else if(a[i+1]!='#') {
 c[j++]=a[i];
c[j++]=' ';
i++;
 flag=!flag;
}
else {
continue; 
}
}
while(flag) {
 if(a[i]=='(') {
 optr.Push(a[i]);
}
else if(a[i]==')') {
while(optr.GetTop()!='(' && optr.GetTop()!='#') {
c[j++]=optr.Pop();
c[j++]=' ';
}
optr.Pop();

}
else if(a[i]>='0' && a[i]<='9' || a[i]=='.') {
while(a[i]>='0' && a[i]<='9' || a[i]=='.') {
c[j++]=a[i++];
}
c[j++]=' ';
i--;
}
else {
int l=Compare(a[i]),r=Compare(optr.GetTop());
if(l<=r)
{
while(Compare(a[i])<=Compare(optr.GetTop())) {
c[j++]=optr.Pop();
c[j++]=' ';
}
optr.Push(a[i]);
}
else
optr.Push(a[i]);
}
break;
}
}
 }
 
double GetValue(char *c) {
int i=0,j;
char exp[100];
SeqStack<float> opnd;
while(c[i]!='\0') {
if(c[i]=='#') {
i++;
}

else if(c[i]>='0' && c[i]<='9' || c[i]=='.')
{
j=0;
while(c[i]>='0' && c[i]<='9' || c[i]=='.')
exp[j++]=c[i++];
exp[j]=0;
opnd.Push(atof(exp));
}
else if(c[i]==' ')
i++;
else
{
float a,b;
b=opnd.Pop();
a=opnd.Pop();
opnd.Push(Computer(a,b,c[i]));
i++;
}
}
return opnd.Pop();
}


int main() {
 string A="#(1.3*2^3*4/6)+(2.5-8/2-5)#";
 char B[A.length()] ={'0'};
 char C[100];
 for(int i=0;i<A.length();i++) {
 B[i]=A[i];
}
 SeqStack<char> SS;
 SS.ChangeStack(B,A.length(),C);
 cout<<"輸入的中綴表示式為(#為邊界):"<<A<<endl; 
 cout<<"中綴轉字尾表示式為:"<<C<<endl;
 cout<<"表示式的值為:"<<GetValue(C);
 return 0;
 }