Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <sstream>
- #include <cstdlib>
- using namespace std;
- struct licz {
- string infix;
- int wynik;
- int nawiasy;
- };
- class lista {
- public:
- typedef licz wartosc;
- private:
- struct element{
- wartosc wart;
- element * nastepny, * poprzedni;
- };
- public:
- typedef element* pozycja;
- private:
- pozycja pierwszy, ostatni;
- public:
- lista();
- ~lista();
- bool empty();
- wartosc front();
- wartosc back();
- void push_front(wartosc);
- void push_back(wartosc);
- void pop_front();
- void pop_back();
- void wypisz();
- void erase(pozycja e);
- };
- lista::lista(){
- pierwszy=ostatni=NULL;
- }
- lista ::~lista (){
- pozycja pom;
- while(pierwszy!=NULL)
- {
- pom=pierwszy;
- pierwszy=pierwszy->nastepny;
- delete pom;
- }
- }
- bool lista :: empty (){
- if (pierwszy==NULL)
- return true;
- else
- return false;
- }
- lista:: wartosc lista::front(){
- return pierwszy->wart;
- }
- lista:: wartosc lista::back (){
- return ostatni->wart;
- }
- void lista::push_front(lista::wartosc w){
- pozycja pom=new element;
- pom->wart=w;
- pom->poprzedni=NULL;
- pom->nastepny=pierwszy;
- pierwszy=pom;
- if(pom->nastepny!=NULL) pom->nastepny->poprzedni=pom;
- else ostatni=pom;
- }
- void lista::push_back(lista::wartosc w){
- pozycja pom=new element;
- pom->wart=w;
- pom->nastepny=NULL;
- pom->poprzedni=ostatni;
- ostatni=pom;
- if(pom->poprzedni!=NULL) pom->poprzedni->nastepny=pom;
- else pierwszy=pom;
- }
- void lista::pop_front(){
- pozycja pom=pierwszy;
- if(pom!=NULL){
- pierwszy=pierwszy->nastepny;
- if(pierwszy==NULL)
- ostatni=NULL;
- else
- pierwszy->poprzedni=NULL;
- delete pom;
- }
- }
- void lista::pop_back(){
- pozycja pom=ostatni;
- if(pom!=NULL){
- ostatni=ostatni->poprzedni;
- if(ostatni==NULL)
- pierwszy=NULL;
- else
- ostatni->nastepny=NULL;
- delete pom;
- }
- }
- class stos
- {
- private:
- struct liczba{
- int wart;
- liczba *next;
- };
- public:
- typedef liczba* pozycja;
- private:
- pozycja root=NULL;
- public:
- void push(int a)
- {
- pozycja pom=new liczba;
- pom->wart=a;
- pom->next=root;
- root=pom;
- }
- void pop()
- {
- if(root)
- {
- pozycja pom=root;
- root=root->next;
- delete pom;
- }
- }
- int front()
- {
- return root->wart;
- }
- };
- class stosString
- {
- private:
- struct liczba{
- string wart;
- int waga;
- liczba *next;
- };
- public:
- typedef liczba* pozycja;
- private:
- pozycja root=NULL;
- public:
- void push(string a, int w)
- {
- pozycja pom=new liczba;
- pom->wart=a;
- pom->waga=w;
- pom->next=root;
- root=pom;
- }
- void pop()
- {
- if(root)
- {
- pozycja pom=root;
- root=root->next;
- delete pom;
- }
- }
- string front()
- {
- return root->wart;
- }
- int frontwaga()
- {
- return root->waga;
- }
- int pior()
- {
- if(root->wart=="+" || root->wart=="-")
- return 1;
- if(root->wart=="/" || root->wart=="*")
- return 2;
- else
- return 3;
- }
- };
- licz posttoinfix(string napis)
- {
- istringstream iss(napis);
- string pom, pom1, pom2;
- int waga1,waga2, nawiasy=0;
- string infix="";
- stosString liczby;
- licz wyniki;
- while(iss >> pom)
- {
- if(pom!="+"&& pom!="-" && pom!="*" && pom!="/")
- liczby.push(pom,3);
- if(pom=="+")
- {
- pom1=liczby.front();
- liczby.pop();
- pom2=liczby.front();
- liczby.pop();
- infix=pom2+pom+pom1;
- liczby.push(infix,1);
- }
- if(pom=="-")
- {
- pom1=liczby.front();
- waga1=liczby.frontwaga();
- liczby.pop();
- pom2=liczby.front();
- waga2=liczby.frontwaga();
- liczby.pop();
- if(waga1==1)
- {
- pom1="("+pom1+")";
- nawiasy++;
- }
- infix=pom2+pom+pom1;
- liczby.push(infix,1);
- }
- if(pom=="*")
- {
- pom1=liczby.front();
- waga1=liczby.frontwaga();
- liczby.pop();
- pom2=liczby.front();
- waga2=liczby.frontwaga();
- liczby.pop();
- if(waga1==1)
- {
- pom1="("+pom1+")";
- nawiasy++;
- }
- if(waga2==1)
- {
- pom2="("+pom2+")";
- nawiasy++;
- }
- infix=pom2+pom+pom1;
- liczby.push(infix,2);
- }
- if(pom=="/")
- {
- pom1=liczby.front();
- waga1=liczby.frontwaga();
- liczby.pop();
- pom2=liczby.front();
- waga2=liczby.frontwaga();
- liczby.pop();
- if(waga1<=2)
- {
- pom1="("+pom1+")";
- nawiasy++;
- }
- if(waga2<2)
- {
- pom2="("+pom2+")";
- nawiasy++;
- }
- infix=pom2+pom+pom1;
- liczby.push(infix,2);
- }
- }
- wyniki.infix=liczby.front();
- wyniki.nawiasy=nawiasy;
- return wyniki;
- }
- int zamiana(string a)
- {
- string pom;
- stos liczby;
- int cyfra,d,b;
- istringstream iss(a);
- while(iss >> pom)
- {
- if(pom!="+" && pom!="/" && pom!="*" && pom!="-")
- {
- cyfra=atoi(pom.c_str());
- liczby.push(cyfra);
- }
- else{
- switch(pom[0])
- {
- case '*':
- d=liczby.front();
- liczby.pop();
- b=liczby.front();
- liczby.pop();
- liczby.push(d*b);
- break;
- case '/':
- d=liczby.front();
- liczby.pop();
- b=liczby.front();
- liczby.pop();
- liczby.push(d/b);
- break;
- case '+':
- d=liczby.front();
- liczby.pop();
- b=liczby.front();
- liczby.pop();
- liczby.push(d+b);
- break;
- case '-':
- d=liczby.front();
- liczby.pop();
- b=liczby.front();
- liczby.pop();
- liczby.push(b-d);
- break;
- }
- }
- }
- return liczby.front();
- }
- int main()
- {
- int K,wynik,wyniki[4], index=0, ile=0;
- string napis;
- licz liczby;
- cin>>K;
- int wyniki[K];
- licz infix[K];
- char znak[1];
- for(int i=0;i<K;i++)
- {
- cin>>znak;
- if(znak[0]=='D')
- {
- cin.ignore();
- getline(cin,napis);
- wyniki[i]=zamiana(napis);
- infix[i]=posttoinfix(napis);
- }
- if(znak[0]=='S')
- {
- cin>>wynik;
- for(int i=0;i<K;i++)
- {
- if(wyniki[i]==wynik)
- ile++;
- }
- index=[i];
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement