Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.35 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. //função calculadora
  169. int Calculadora(int a, char simb, int b)
  170. {
  171. switch(simb)
  172. {
  173. case '+':
  174. return a+b;
  175.  
  176. case '-':
  177. return a-b;
  178.  
  179. case '/':
  180. return a/b;
  181.  
  182. case '*':
  183. return b*a;
  184.  
  185. case '^':
  186. return (int)pow(a,b);
  187. }
  188. }
  189.  
  190. main()
  191. {
  192. FILE *CALCULADORA;
  193.  
  194. int r, i, j,a,b,c,valida=1;
  195. char vetor[100],simbolo,t;
  196.  
  197. pilha <char> *operador, *P, *aux, *infixa;
  198. pilha <int> *resultado;
  199.  
  200. operador=new pilha<char>;
  201. P=new pilha<char>;
  202. aux=new pilha<char>;
  203. infixa=new pilha<char>;
  204. resultado= new pilha<int>;
  205.  
  206. cout<<"digite sua expressao:"<<endl<<"digite '=' quando terminar"<<endl;
  207. cin>>simbolo;
  208.  
  209.  
  210. //vai verificar se a pilha esta balanceada
  211. while(simbolo != '=') {
  212.  
  213. switch(simbolo){
  214.  
  215. case '(':
  216. P->push(simbolo);
  217. operador->push(simbolo);
  218. break;
  219.  
  220. case ')':
  221. if(P->empty())
  222. valida=0;
  223.  
  224. else{
  225. t=P->top();
  226. P->pop();
  227.  
  228. if((simbolo == ')' && t != '('))
  229. valida=0;
  230. }
  231.  
  232. break;
  233. }
  234.  
  235.  
  236. //if vai empilhar na pilha auxiliar (aux) se for operando
  237. if(simbolo=='0' || simbolo=='1' || simbolo=='2' || simbolo=='3' || simbolo=='4' || simbolo=='5' || simbolo=='6' ||
  238. simbolo=='7' || simbolo=='8' || simbolo=='9')
  239. aux->push(simbolo);
  240.  
  241. else{
  242.  
  243. //se for operador
  244. switch(simbolo){
  245. case '+':
  246. case '*':
  247. case '/':
  248. case '-':
  249. case '(':
  250. case '^':
  251.  
  252. //enquanto a pilha não estiver vazia e a prioridade de chegada for <= que a prioridade de entrada da pilha
  253. //vai guardar o topo da pilha, remover elemento, inserir na pilha auxiliar
  254. while(!operador->empty() && Prior2(simbolo)<=Prior1(operador->top())){
  255. t=operador->top();
  256. operador->pop();
  257. aux->push(t);
  258. }
  259.  
  260. operador->push(simbolo);
  261. break;
  262.  
  263. case ')':
  264. while(!operador->empty() && operador->top() != '('){
  265. t=operador->top();
  266. operador->pop();
  267. aux->push(t);
  268. }
  269. operador->pop();
  270. break;
  271.  
  272. }
  273. }
  274.  
  275. cin>>simbolo;
  276. }//fim do while
  277.  
  278. //vai inserir os operadores restantes na pilha auxiliar
  279. while(!operador->empty()){
  280. t=operador->top();
  281. operador->pop();
  282. aux->push(t);
  283. }
  284.  
  285. if(!P->empty() || !valida){
  286. cout<<endl<<"expressao nao balanceada"<<endl;
  287.  
  288. delete infixa;
  289. delete operador;
  290. delete aux;
  291. delete resultado;
  292. delete P;
  293. }
  294.  
  295.  
  296. cout<<endl<<"expressao balanceada"<<endl;
  297.  
  298. while(!aux->empty()){
  299. t=aux->top();
  300. infixa->push(t);
  301. aux->pop();
  302. }
  303.  
  304. //teste de while
  305. while(!resultado->empty()){
  306. resultado->pop();}
  307.  
  308. i=0;
  309. while(!infixa->empty()){
  310. simbolo=infixa->top();
  311. vetor[i]=simbolo;
  312. i++;
  313.  
  314. if(simbolo=='0' || simbolo=='1' || simbolo=='2' || simbolo=='3' || simbolo=='4' || simbolo=='5' || simbolo=='6' ||
  315. simbolo=='7' || simbolo=='8' || simbolo=='9'){
  316. //passa pra inteiro
  317. a=atoi(&simbolo);
  318. resultado->push(a);
  319. }
  320.  
  321. //simbolo é operador
  322. //joga simbolo na variavel t, pega o proximo numero da fila infixa junto com o topo da pilha resultado e efetua o calculo
  323. else{
  324. t=simbolo;
  325. b=resultado->top();
  326. resultado->pop();
  327.  
  328. infixa->pop();
  329. simbolo=infixa->top();
  330.  
  331. a=atoi(&simbolo);
  332.  
  333. c=Calculadora(a, t, b);
  334. resultado->push(c);
  335. }
  336. infixa->pop();
  337. }
  338. r=resultado->top();
  339. cout<<endl<<"resultado da operacao: "<<r<<endl;
  340.  
  341. delete infixa;
  342. delete operador;
  343. delete aux;
  344. delete resultado;
  345. delete P;
  346.  
  347. //arquivo .txt
  348. CALCULADORA=fopen("CALCULADORA.txt", "w");
  349. fprintf(CALCULADORA, "expresao balanceada \n");
  350. fprintf(CALCULADORA, "resposta = %d", r);
  351. fprintf(CALCULADORA, "\n \n");
  352. fclose(CALCULADORA);
  353.  
  354. system("pause=0");
  355.  
  356. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement