Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. #include "iostream"
  2. #include "math.h"
  3. #include "stdlib.h"
  4. #include "stdio.h"
  5. using namespace std;
  6.  
  7.  
  8. //class NÓ
  9. template <class T>
  10. class No
  11. {
  12. private:
  13. No<T>*prox;
  14. T info;
  15.  
  16.  
  17. public:
  18. No(T elem, No<T>*p);
  19.  
  20. T getinfo();
  21. No<T>*getprox();
  22. void setinfo(T);
  23. void setprox(No<T>*p);
  24. };
  25.  
  26.  
  27. template <class T>
  28. No<T> :: No(T elem,No<T> *p)
  29. {
  30. info=elem;
  31. prox=p;
  32. }
  33.  
  34. template <class T>
  35. T No<T> :: getinfo()
  36. {return info;
  37. }
  38.  
  39. template <class T>
  40. No<T> *No<T> :: getprox()
  41. {return prox;
  42. }
  43.  
  44. template <class T>
  45. void No<T> :: setinfo(T elem)
  46. {info=elem;
  47. }
  48.  
  49. template <class T>
  50. void No<T> :: setprox(No<T>*p)
  51. {prox=p;
  52. }
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59. //classe pilha
  60. template <class T>
  61. class pilha
  62. {
  63. private:
  64. No<T> *topo;
  65. int elem;
  66.  
  67. public:
  68. pilha(void);
  69. void push(T);
  70. int pop(void);
  71. T top (void);
  72. int empty(void);
  73. };
  74.  
  75. template <class T>
  76. pilha<T> :: pilha()
  77. {topo == NULL;
  78. }
  79.  
  80. template <class T>
  81. void pilha<T> :: push(T elem)
  82. {No<T> *Novo;
  83. Novo=new No<T>(elem, topo);
  84. topo=Novo;
  85. }
  86.  
  87. template <class T>
  88. int pilha<T> :: pop()
  89. {No<T> *p;
  90.  
  91. if(empty())
  92. return 0;
  93. else
  94. p=topo;
  95. topo=topo->getprox();
  96. delete p;
  97. return 1;
  98. }
  99.  
  100. template <class T>
  101. int pilha<T> :: empty()
  102. {if(topo==NULL)
  103. return 1;
  104. else
  105. return 0;
  106. }
  107.  
  108. template <class T>
  109. T pilha<T> :: top()
  110. {if(!empty())
  111. return topo->getinfo();
  112. }
  113.  
  114.  
  115. //prioridade dentro da fila
  116. int Prior1(char c)
  117. {
  118. switch(c)
  119. {
  120. case'(':
  121. return 0;
  122.  
  123. case '-':
  124. return 1;
  125.  
  126. case '+':
  127. return 1;
  128.  
  129. case '*':
  130. return 2;
  131.  
  132. case '/':
  133. return 2;
  134.  
  135. case '^':
  136. return 3;
  137.  
  138. }
  139. }
  140.  
  141.  
  142. //prioridade de chegada na pilha
  143. int Prior2(char c)
  144. {
  145. switch(c)
  146. {
  147. case '(':
  148. return 5;
  149.  
  150. case '^':
  151. return 4;
  152.  
  153. case '/':
  154. return 2;
  155.  
  156. case '*':
  157. return 2;
  158.  
  159. case '+':
  160. return 1;
  161.  
  162. case '-':
  163. return 1;
  164. }
  165. }
  166.  
  167.  
  168.  
  169.  
  170. //metodo calculadora
  171.  
  172. class Calculadora{
  173.  
  174. public:
  175. int calculadora(int a, char simb, int b);
  176. };
  177. int Calculadora :: calculadora(int a, char simb, int b)
  178. {
  179. switch(simb)
  180. {
  181. case '+':
  182. return a+b;
  183.  
  184. case '-':
  185. return a-b;
  186.  
  187. case '/':
  188. return a/b;
  189.  
  190. case '*':
  191. return b*a;
  192.  
  193. case '^':
  194. return (int)pow(a,b);
  195. }
  196. }
  197.  
  198. int charpraint(char x){
  199. switch(x){
  200. case '0':
  201. return 0;
  202.  
  203. case '1':
  204. return 1;
  205.  
  206. case '2':
  207. return 2;
  208.  
  209. case '3':
  210. return 3;
  211.  
  212. case '4':
  213. return 4;
  214.  
  215. case '5':
  216. return 5;
  217.  
  218. case '6':
  219. return 6;
  220.  
  221. case '7':
  222. return 7;
  223.  
  224. case '8':
  225. return 8;
  226.  
  227. case '9':
  228. return 9;
  229. }
  230. }
  231.  
  232. main()
  233. {
  234. FILE *CALCULADORA;
  235.  
  236. int r, i, j,a,b,c,valida=1;
  237. char vetor[100],simbolo,t;
  238.  
  239. pilha <char> *operador, *P, *aux, *infixa;
  240. pilha <int> *resultado;
  241.  
  242. operador=new pilha<char>;
  243. P=new pilha<char>;
  244. aux=new pilha<char>;
  245. infixa=new pilha<char>;
  246. resultado= new pilha<int>;
  247.  
  248. cout<<"digite sua expressao:"<<endl<<"digite '=' quando terminar"<<endl;
  249. cin>>simbolo;
  250.  
  251.  
  252. //vai verificar se a pilha esta balanceada
  253. while(simbolo != '=') {
  254.  
  255. switch(simbolo){
  256.  
  257. case '(':
  258. P->push(simbolo);
  259. operador->push(simbolo);
  260. break;
  261.  
  262. case ')':
  263. if(P->empty())
  264. valida=0;
  265.  
  266. else{
  267. t=P->top();
  268. P->pop();
  269.  
  270. if((simbolo == ')' && t != '('))
  271. valida=0;
  272. }
  273.  
  274. break;
  275. }
  276.  
  277.  
  278. //if vai empilhar na pilha auxiliar (aux) se for operando
  279. if(simbolo=='0' || simbolo=='1' || simbolo=='2' || simbolo=='3' || simbolo=='4' || simbolo=='5' || simbolo=='6' ||
  280. simbolo=='7' || simbolo=='8' || simbolo=='9')
  281. aux->push(simbolo);
  282.  
  283. else{
  284.  
  285. //se for operador
  286. switch(simbolo){
  287. case '+':
  288. case '*':
  289. case '/':
  290. case '-':
  291. case '(':
  292. case '^':
  293.  
  294. //enquanto a pilha não estiver vazia e a prioridade de chegada for <= que a prioridade de entrada da pilha
  295. //vai guardar o topo da pilha, remover elemento, inserir na pilha auxiliar
  296. while(!operador->empty() && Prior2(simbolo)<=Prior1(operador->top())){
  297. t=operador->top();
  298. operador->pop();
  299. aux->push(t);
  300. }
  301.  
  302. operador->push(simbolo);
  303. break;
  304.  
  305. case ')':
  306. while(!operador->empty() && operador->top() != '('){
  307. t=operador->top();
  308. operador->pop();
  309. aux->push(t);
  310. }
  311. operador->pop();
  312. break;
  313.  
  314. }
  315. }
  316.  
  317. cin>>simbolo;
  318. }//fim do while
  319.  
  320. //vai inserir os operadores restantes na pilha auxiliar
  321. while(!operador->empty()){
  322. t=operador->top();
  323. operador->pop();
  324. aux->push(t);
  325. }
  326.  
  327. if(!P->empty() || !valida){
  328. cout<<endl<<"expressao nao balanceada"<<endl;
  329.  
  330. delete infixa;
  331. delete operador;
  332. delete aux;
  333. delete resultado;
  334. delete P;
  335. }
  336.  
  337.  
  338. cout<<endl<<"expressao balanceada"<<endl;
  339.  
  340. while(!aux->empty()){
  341. t=aux->top();
  342. infixa->push(t);
  343. aux->pop();
  344. }
  345.  
  346. //teste de while
  347. while(!resultado->empty()){
  348. resultado->pop();}
  349.  
  350. i=0;
  351. while(!infixa->empty()){
  352. simbolo=infixa->top();
  353. vetor[i]=simbolo;
  354. i++;
  355.  
  356. if(simbolo=='0' || simbolo=='1' || simbolo=='2' || simbolo=='3' || simbolo=='4' || simbolo=='5' || simbolo=='6' ||
  357. simbolo=='7' || simbolo=='8' || simbolo=='9'){
  358. //passa pra inteiro
  359. a=charpraint(simbolo);
  360. resultado->push(a);
  361. }
  362.  
  363. //simbolo é operador
  364. else{
  365. b=resultado->top();
  366. resultado->pop();
  367. a=resultado->top();
  368. resultado->pop();
  369. c=calculadora(a, simbolo, b);
  370. resultado->push(c);
  371. }
  372. infixa->pop();
  373. }
  374. r=resultado->top();
  375. cout<<endl<<"resultado da operacao: "<<r<<endl;
  376.  
  377. delete infixa;
  378. delete operador;
  379. delete aux;
  380. delete resultado;
  381. delete P;
  382.  
  383. //arquivo .txt
  384. CALCULADORA=fopen("CALCULADORA.txt", "w");
  385. fprintf(CALCULADORA, "expresao balanceada \n");
  386. fprintf(CALCULADORA, "resposta = %d", r);
  387. fprintf(CALCULADORA, "\n \n");
  388. fclose(CALCULADORA);
  389.  
  390. system("pause=0");
  391.  
  392. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement