ایراد این برنامه کجاست؟

lighting

Member
سلام
من اون برنامه ای رو که مربوط به این بود که : ساختار پشته رو به صورت شی گرا و با استفاده از ارایه پیاده سازی کنید و الگوریتم تبدیل یک عبارت ریاضی میانوندی به پسوندی را با استفاده از پشته طراحی شده پیاده سازی کنید. عبارت ریاضی می تواند شامل عملگر چهارگانه، پرانتز و توان باشد این عبارت از طریق یک فایل in.txt به عنوان ورودی به برنامه داده می شود خروجی می بایست در فایل out.txt ذخیره شود؟
این سوال بود(شرمنده یکم زیاد شد)
من قبلا یه چند تا سوال در مورد همین برنامه از شما پرسیده بودم و الان در نهایت کامل شده این برنامه رو نوشتم ولی یه error می ده که هر کاری می کنم درست نمی شه!!!!
می شه لطفا راهنمایی کنید؟
بازم خیلی ممنون از راهنمایی هاتون.
اینم برنامه کامل سوال بالا:
کد:
#include <iostream>
#include <conio>
#include <fstream>
template <class Type>
   class ArrayStack
   {
   private:
   int capacity,top;
   Type *s;
   public:
   ArrayStack ()
   {
      capacity=1000;
      s=new Type [capacity];
      top=-1;
      }
   Arraystack (int cap)
   {
       capacity=cap;
       s=new Type [capacity];
       top=-1;
       }
   void push (Type var)
       {
         if (Isfull()) return;
         else
         s[++top]=var;
         }
   Type pop()
         {
         if (Isempty()) return s[0];
         else
         return s[top--];
         }
   int Isfull()
      {
      if (top <capacity-1) return 0;
      else
      return 1;
      }
   int Isempty()
        {
        if (top==-1) return 0;
        else
        return 1;
        }
  void postfix (expression (s))
        {
        char t;
          for (int i=0;s[i]!='10';i++){
           if (s[i] is an operand)
            cout<<s[i];
             else
           if (s[i]=='(')
               push (s[i]);
                else
           if (s[i]==')')
                  for (pop(t);t!='(';pop(t))
                   cout<<t;
                    else{
           if (Isempty()|| p(ArrayStack [top])<p(s[i]))
                     push (s[i]);
                      else{
           for (pop(t);p(t)>=p(s[i])&&t!='(';pop(t))
                        cout<<t;
                         push(t);
                          push(s[i]);
                          }
                          }
                          }
                           while (!Isempty())
                           {
                            pop(t);
                            cout<<t;
                             }
                             }
    void main()
    {
    ofstream in ("in.txt");
     ArrayStack d1("((a\\b)-c)+(d*e)-(a*c))^d") , d2("ab\\c-de*+ac*-d^")
     d1.in<<"((a\\b)-c)+(d*e)-(a*c))^d";
    in.close();
    ofstream out ("out.txt");
    d2.out<<"ab\\c-de*+ac*-d^";
    out.close();
    getch();
    }
    };
 
آخرین ویرایش:

the_king

مدیرکل انجمن
postfix بخشی از کلاس پشته نیست، postfix قراره از یک پشته استفاده کنه، خودش که نباید داخل کلاس پشته باشه.

Isempty یعنی پشته خالی است یا خیر، وقتی خالی است باید مقدار 1 برگردانید، نه صفر، مقادیری که بر می گردانید
برعکس هستند :
کد:
int Isempty()
{
	if (top == -1)
		return 0;
        else
		return 1;
}

اولویت عملگر ها رو رعایت نکردید و expression و operand هم که مفهوم مشخصی ندارند.

کد:
#include <iostream>
#include <fstream>
#include <conio.h>

using namespace std;

template <class Type>
class ArrayStack
{
    private:
        int capacity, top;
        Type *s;
    public:
        ArrayStack()
        {
            capacity = 1000;
            s = new Type[capacity];
            top = -1;
        }

        ArrayStack(int cap)
        {
            capacity = cap;
            s = new Type[capacity];
            top = -1;
        }

        void push(Type var)
        {
            if (Isfull())
                return;
            s[++top] = var;
        }

        Type pop()
        {
            if (Isempty())
                return s[0];
            return s[top--];
        }

        Type topmost()
        {
            if (Isempty())
                return s[0];
            return s[top];
        }

        int Isfull()
        {
            if (top < capacity - 1)
                return 0;
            return 1;
        }

        int Isempty()
        {
            if (top == -1)
                return 1;
            return 0;
        }
};

int isOperand(char c)
{
    char s[] = "0123456789";
    for (int i = 0; s[i]; i++)
        if (s[i] == c)
            return 1;
    return 0;
}

int precedency(char c)
{
    switch (c)
    {
        case '(':
            return 4;
        case '^':
            return 3;
        case '\\':
            return 2;
        case '*':
            return 2;
        case '+':
            return 1;
        case '-':
            return 1;
        default:
            return 0;
    }
}

void postfix(char s[], char p[])
{
    ArrayStack<char> stack;
    char t;
    int x = 0;
    for (int i = 0; s[i]; i++)
    {
        if (isOperand(s[i]))
        {
            p[x] = s[i];
            x++;
        }
        else
        {
            switch (s[i])
            {
                case '(':
                    stack.push(s[i]);
                    break;
                case ')':
                    while (!stack.Isempty())
                    {
                        t = stack.pop();
                        if (t == '(')
                            break;
                        p[x] = t;
                        x++;
                    }
                    break;
                default:
                    while (!stack.Isempty())
                    {
                        if (precedency(stack.topmost()) > precedency(s[i]))
                            break;
                        p[x] = stack.pop();
                        x++;
                    }
                    stack.push(s[i]);
            }
        }
    }
    while (!stack.Isempty())
    {
        p[x] = stack.pop();
        x++;
    }
    p[x] = 0;
}

void main()
{
    ofstream f("in.txt");
    f << "(((a\\b)-c)+(d*e)-(a*c))^d" << endl;
    f.close();

    char s[1000], p[1000];
    ifstream in("in.txt");
    in >> s;
    in.close();
    postfix(s, p);
    ofstream out("out.txt");
    out << p;
    out.close();

    cout << p;
    getch();
}
 

جدیدترین ارسال ها

بالا