Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- double ONP()
- {
- char c;
- StackItem* pHead = NULL; // wyzerowanie stosu
- DStackItem* pDHead = NULL; // wyzerowanie stosu
- dpush(&pDHead, GetNum());
- while (IsOper(c=GetOper()))
- {
- if (c == '(')
- {
- push(&pHead, c); // dopisuje na stos nawias otwierający
- dpush(&pDHead, GetNum());
- }
- else if (c == ')')
- {
- while (c != '(')
- {
- while (prior(c) <= prior(top(pHead)))
- {
- double x = dpop(&pDHead);
- dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
- }
- break;
- }
- pop(&pHead);
- }
- else
- {
- while (prior(c) <= prior(top(pHead))) // prior operatora MUSI byc silnie wiekszy od prior szczytu stosu
- {
- double x = dpop(&pDHead);
- dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x)); // podmianka
- }
- push(&pHead, c);
- if (IsOper(c == GetOper()))
- ungetc(c, stdin);
- else
- {
- ungetc(c, stdin);
- dpush(&pDHead, GetNum());
- }
- }
- }
- while (!isEmpty(pHead))
- {
- double x = dpop(&pDHead);
- dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
- }
- return dpop(&pDHead);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement