Самостійне вивчення
Для самостійного вивчення пропонується програма 20.21, яка зберігає арифметичні вирази у вигляді стеку та обчислює їх результат.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
#include<string.h>
#include<process.h>
const int LEN=80;
const int MAX=40;
///////////
class Stack
{private:
char st[MAX];
int top;
public:
Stack()
{top=0;}
void push(char var)
{st[++top]=var;}
char pop()
{return st[top--];}
int gettop()
{return top;}
};
///////////
class express
{private:
Stack s;
char* pStr;
int len;
public:
express(char* ptr)
{pStr=ptr;
len=strlen(pStr);}
void parse();
int solve();
};
//////////////
void express::parse()//add to stack
{
char ch;
char lastval;//останнє значення
char lastop;//останній оператор
for(int j=0;j<len;j++)
{ch=pStr[j];
if (ch>=’0’ && ch<=’9’)//якщо цифра
s.push(ch-‘0’);
else
if(ch==’+’||ch==’-‘||ch==’*’||ch==’/’)
{if (s.gettop()==1)
s.push(ch);
else
{lastval=s.pop();
lastop=s.pop();
if((ch==’*’||ch==’/’)&&(lastop==’+’||lastop==’-‘))
{s.push(lastop);
s.push(lastval);}
else
{switch(lastop)
{case’+’:s.push(s.pop()+lastval);break;
case’-‘:s.push(s.pop()-lastval);break;
case’*’:s.push(s.pop()*lastval);break;
case’/’:s.push(s.pop()/lastval);break;
default: cout<<”\nНевідомий оператор”;bioskey(0);exit(1);
}
}s.push(ch);
}
}
else
{cout<<”\nНевідомий символ”;
bioskey(0);
exit(1);
}
}
}
///////////
int express::solve()
{char lastval;
while(s.gettop()>1)
{lastval=s.pop();
switch(s.pop())
{case ‘+’:s.push(s.pop()+lastval); break;
case ‘-‘:s.push(s.pop()-lastval); break;
case ‘*’:s.push(s.pop()*lastval); break;
case ‘/’:s.push(s.pop()/lastval); break;
default:cout<<”\nНевідомий оператор”;bioskey(0);exit(1);
}
}
return int(s.pop());
}
////////////////
int main()
{clrscr();
char ans;
char string[LEN];
cout<<”\nВведіть вираз як 2+3*4/3-2”;
cout<<”\nЧисла з 1 цифри”;
cout<<”\nБез пропусків та дужок”;
do
{cout<<”\nВираз:”;
cin>>string;
express* eptr=new express(string);
eptr->parse();
cout<<”\nРезультат:”<<eptr->solve();
delete eptr;
cout<<”\nContinue y/n?”;
cin>>ans;
} while (ans==’y’);
return 0;
}
Програма 20.21
Дата добавления: 2015-08-26; просмотров: 512;