Advertisement
Adytzu04

l4p1-SDA

May 31st, 2013
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.97 KB | None | 0 0
  1. #include"l4p1.h"
  2.  
  3. int main()
  4. {
  5.     char exp[MAXN];
  6.     cout<<"Dati expresia ";
  7.     cin>>expr;
  8.     char*pf=infix2Postfix(expr);
  9.     cout<<"val"<<expr<<"="<<eval(pf)<<endl;
  10.     delete[]pf;
  11.     pf=0;
  12.  
  13.     return 0;
  14.  
  15. }
  16.  
  17. /c
  18.  
  19. #include"l4p1.h"
  20.  
  21. //stiva
  22. void initStack(Stiva &S)
  23. {
  24.     S=0;
  25. }
  26.  
  27. int isEmpty(Stiva S)
  28. {
  29.     return !S;
  30. }
  31.  
  32. Atom top(Stiva S)
  33. {
  34.     assert(S);
  35.     return S->data;
  36. }
  37.  
  38. void push(Stiva &S, Atom a)
  39. {
  40.     PNod p=new Nod;
  41.     assert(p);
  42.     p->data=a;
  43.     p->Succ=S;
  44.     S=p;
  45. }
  46.  
  47. Atom pop(Stiva &S)
  48. {
  49.     assert(s);
  50.     PNod p=S;
  51.     S=S->Succ;
  52.     Atom a=p->data;
  53.     delete p;
  54.     return a;
  55. }
  56.  
  57. int pos(char c)
  58. {
  59.     switch(c)
  60.     {
  61.     case '+':case '-' return 1;
  62.     case '*':case '/' return 2;
  63.     case '^': return 3;
  64.     case '(': return 0;
  65.     case '#': return -1;
  66.     }
  67. }
  68.  
  69. char* infix2Postfix(char exp[])
  70. {
  71.     char buffer[MAXN],*rez;
  72.     StivaC(sopt=0;push(s,'#');  //sopt StivaOperatori
  73.     int i,j=0;
  74.     char C;
  75.     for(i=0;expr[i];i++)
  76.         if (isdigit(exp[i]))
  77.         {
  78.             buffer[j++]=expr[i];
  79.         }
  80.         else if(expr[i]==')')
  81.             while(top((sopt)!='(')
  82.             {
  83.                 buffer[j++]=popC(sopt);
  84.                 c=popC(sopt);
  85.             }
  86.         else
  87.             while(pos(topS(sopt))>=poe(exp[i]))
  88.                 buffer[j++]=popC(sopt);
  89.         pushC(sopt,exp[i]);
  90.         while(topC(sopt)!='#')
  91.             buffer[j++]=popC(sopt);
  92.             c=popC(sopt);
  93.             buffer[j++]='\0';
  94.             rez=new char[j];
  95.             assert(rez);
  96.             strcpy(rez,buffer);
  97.                 return rez;
  98. }
  99.  
  100. double eval(char *pf)
  101. {
  102.     double rez,a,b;
  103.     StivaD s=0;
  104.     int i;
  105.     for(i=0;pf[i];i++)
  106.         if(isdigit(pf[i]))
  107.             pushD(s,pf[i]-'0');
  108.         else
  109.         {
  110.             b=popD(s);
  111.             a=popD(s);
  112.             switch(pf[i])
  113.             {
  114.                 case '+' pushD(s,a+b);
  115.                     break;
  116.                 case '-' pushD(s,a-b);
  117.                     break;
  118.                 case '*' pushD(s,a*b);
  119.                     break;
  120.                 case '/' pushD(s,a/b);
  121.                     break;
  122.                 case '^' pushD(s,pow(a,b));
  123.                     break;
  124.             }
  125.         }
  126.         assert(s);
  127.         rez=popD(s);
  128.         assert(!s);
  129.         return rez;
  130. }
  131.  
  132.  
  133.  
  134. //coada
  135.  
  136. void initQueque(Coada &C)
  137. {
  138.     C.prom=C.ultim=0;
  139. }
  140.  
  141. int isEmpty(Coada C)
  142. {
  143.     return !C.prim;
  144. }
  145.  
  146. Atom front(Coada C)
  147. {
  148.     assert(C.prim);
  149.     return C.prim->data;
  150. }
  151.  
  152. void put(Coada &C,Atom a)
  153. {
  154.     PNod p=new Nod;
  155.     assert(p);
  156.     p->data=a;
  157.     p->Succ=0;
  158.  
  159.     if(isEmpty(c))
  160.         C.prim=p;
  161.     else
  162.         C.ultim=p;
  163. }
  164.  
  165. Atom get(Coada &C)
  166. {
  167.     assert(C.prim);
  168.     PNod p=C.prim;
  169.     C.prim=p->Succ;
  170.  
  171.     if(!C.prim)
  172.         C.ultim=0;
  173.     Atom a=p->data;
  174.     delete p;
  175.     return a;
  176. }
  177.  
  178. /h
  179. #ifndef                     L4P1_H
  180. #define                     L4P1_H
  181. #pragma once
  182. #define MAXN 1000
  183.  
  184. #include<iostream>
  185. #include<assert.h>
  186. #include<ctype.h>
  187. #include<string.h>
  188. #include<math.h>
  189.  
  190.  
  191. //stiva
  192. typedef char Atom;
  193. typedef struct Nod{
  194.     Atom data;
  195.     Nod Succ;
  196. }*PNod;
  197. typedef PNod Stiva;
  198. //coada
  199. typedef Struct{
  200.     PNod prim,ultim;
  201. }Coada;
  202. //stiva
  203. void initStack(Stiva &S);
  204. int isEmpty(Stiva S);
  205. Atom top(Stiva S);
  206. void push(Stiva &S, Atom a);
  207. Atom pop(Stiva &S);
  208. int pos(char c);
  209. double eval(char *pf);
  210. char* infix2Postfix(char exp[]);
  211.  
  212. //coada
  213. void initQueque(Coada &C);
  214. int isEmpty(Coada C);
  215. Atom front(Coada C);
  216. void put(Coada &C,Atom a);
  217. Atom get(Coada &C);
  218.  
  219.  
  220.  
  221. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement