全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2456
推到 Plurk!
推到 Facebook!

中序轉後序求值

尚未結案
king917018
一般會員


發表:3
回覆:1
積分:0
註冊:2005-04-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-08 18:22:39 IP:61.30.xxx.xxx 未訂閱
#include
#include
using namespace std;    void in2postfix(char *);    int main()
{
    char str[100];
    cout << "請輸入運算式:";
    cin >> str;
    in2postfix(str);
    cout << endl;
    return 0;
}    void in2postfix(char str[])
{
    char op_symbol[]={')','(',' ','-','*','/'};//運算符號
    int order[]={0,1,2,2,3,3};//優先順序
    int op,index=0;
    stack temp;
    while(str[index]!='\0'){
        for(op=0;oporder[temp.top()] || str[index]=='(')
                temp.push(op);
            else if(str[index]==')'){//如果遇到')'就把運算符號印出,直到'('
                while(op_symbol[temp.top()]!='('){
                    cout << op_symbol[temp.top()];
                    temp.pop();
                }
                temp.pop();
            }else{
                //印出堆疊中的符號
                cout << op_symbol[temp.top()];
                temp.pop();
                temp.push(op);//把目前的符號放入堆疊中
            }
        }
        index  ;
    }
    //將堆疊裡剩下的運算符號全部印出
    while(!temp.empty()){
        cout << op_symbol[temp.top()];
        temp.pop();
    }
}
上面的程式可以輸出中序轉後序~~但要如何把後序的值給輸出出來呢~~拜託各位大大~
1.勿以求救...等無意義字眼當主題
2.PO程式碼請參考版規說明,下次就會直接把該文章刪除
發表人 - taishyang 於 2005/04/08 18:47:31
ccobj
一般會員


發表:6
回覆:27
積分:21
註冊:2003-12-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-09 11:50:15 IP:218.172.xxx.xxx 未訂閱
你要有另外一個運算元的堆疊 讓你做計算結果的動作 發表人 - ccobj 於 2005/04/09 11:58:10
ccobj
一般會員


發表:6
回覆:27
積分:21
註冊:2003-12-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-09 11:55:06 IP:218.172.xxx.xxx 未訂閱
//--------------------------------------------------------------------//管理堆疊的物件    class tstack
{
  private:
    tstack *next;
  public:
    tstack *node;
    String data;
    tstack()
    {
      node=NULL;
      next=NULL;
      data="";
    }
    ~tstack()
    {
      while (node!=NULL)
      {
        pop();
      }
    }
    void push(String value)
    {
      tstack *newnode=new tstack;          newnode->next=node;
      newnode->data=value;
      node=newnode;
    }
    String pop()
    {
      tstack *top;
      String value;
      if(node!=NULL)
      {
        top=node;
        node=node->next;
        value=top->data;
        delete top;
      }else{
        value="";
      }
      return value;
    }
}stack,opstack;    //--------------------------------------------------------------------//一個連結串列的結構    struct node
{
  String data;
  node *next;
};    //--------------------------------------------------------------------//判斷是否為運算子
int isop(String op)
{
  char ops=op[1];
  switch (ops)
  {
    case '(':
    case ')':
    case ' ':
    case '-':
    case '*':
    case '/':return 1;
    default:return 0;
  }
}    //--------------------------------------------------------------------//判斷運算子優先順序
int priority(String op)
{
  char ops=op[1];
  switch (ops)
  {
    case NULL:return -1;
    case '(':
    case ')':return 1;
    case ' ':
    case '-':return 2;
    case '*':
    case '/':return 3;
    default:return 0;
  }
}    //--------------------------------------------------------------------//檢查字串最後一個字
String endstr(String instr)
{
  String outstr=instr.SubString(instr.Length(),1);
  return outstr;
}    //--------------------------------------------------------------------//可處理包含小數的四則運算
String alu(String alu1,String alu2,String op)
{
  char ops=op[1];
  String res;
  switch (ops)
  {
    case ' ':
      res=FloatToStr(StrToFloat(alu1) StrToFloat(alu2));
    break;
    case '-':
      res=FloatToStr(StrToFloat(alu1)-StrToFloat(alu2));
    break;
    case '*':
      res=FloatToStr(StrToFloat(alu1)*StrToFloat(alu2));
    break;
    case '/':
      res=FloatToStr(StrToFloat(alu1)/StrToFloat(alu2));
    break;
  }
  return res;
}    //--------------------------------------------------------------------//連結串列增加一節點
node *newlink(node *objlink,String value)
{
  node *newnode=new node;
  if (objlink!=NULL)
  {
    newnode->next=NULL;
    newnode->data=value;
    objlink->next=newnode;
    objlink=newnode;
  }else{
    newnode->next=NULL;
    newnode->data=value;
    objlink=newnode;
  }
  return objlink;
}    //--------------------------------------------------------------------//分離運算元與運算子,用link串聯起來
node *CutString(String inorder)
{
  int op=0;
  int old=0;
  int cnt=1;
  int count=0;
  node *InorderHead=NULL;
  node *InorderTail=NULL;      String tempstr;      for (int i=1;i<=inorder.Length();i  )
  {
    if ((inorder[i]=='-') && (i<2 || priority(inorder[i-1])>1))
    {
      tempstr=tempstr "(-1)*";
    }else{
      tempstr=tempstr inorder[i];
    }
  }      old=0;
  String a;
  for (int i=1;i<=tempstr.Length() 1;i  )
  {
    if (i<=tempstr.Length())
    {
      op=priority(tempstr.SubString(i,1));
    }else{
      op=-1;
    }
    if (old!=op || isop(tempstr.SubString(i,1)))
    {
      if (!(tempstr.SubString(i-1,1)=="-" && (priority(tempstr.SubString(i-2,1))>1 || tempstr.SubString(i-2,1)=="(")))
      {
        a=tempstr.SubString(cnt,i-cnt);
        InorderTail=newlink(InorderTail,tempstr.SubString(cnt,i-cnt));            cnt=i;
        if (count==0)
        {
          InorderHead=InorderTail;
          count=1;
        }
      }
    }
    old=op;
  }
  return InorderHead;
}    //--------------------------------------------------------------------//將中序轉為後序
String conv(node *Inorder)
{
  String postorder;
  String op=0,alu1,alu2;
  node *del;      while (Inorder!=NULL)
  {
    if (isop(Inorder->data) && Inorder->data.Length()==1)
    {
      if (opstack.node==NULL || Inorder->data=="(")
      {
        opstack.push(Inorder->data);
      }else{
        if (Inorder->data==")")
        {
          while(opstack.node->data!="(")
          {
            op=opstack.pop();
            alu1=stack.pop();
            alu2=stack.pop();
            stack.push(alu(alu2,alu1,op));
            postorder =" " op;
          }
          op=opstack.pop();
        }else{
          while(opstack.node!=NULL && priority(Inorder->data) <= priority(opstack.node->data))
          {
            op=opstack.pop();
            alu1=stack.pop();
            alu2=stack.pop();
            stack.push(alu(alu2,alu1,op));
            postorder =" " op;
          }
          opstack.push(Inorder->data);
        }
      }
    }else{
      stack.push(Inorder->data);
      postorder =" " Inorder->data;
    }
    del=Inorder;
    Inorder=Inorder->next;
    delete del;
  }
  while (opstack.node!=NULL)
  {
    op=opstack.pop();
    alu1=stack.pop();
    alu2=stack.pop();
    stack.push(alu(alu2,alu1,op));
    postorder =" " op;
  }
  return postorder;
}
剛好以前有做過 把我的CODE給你參考看看 因為老師規定不能用內建的STACK函式 所以有做一個STACK的物件來管理 呼叫的方法是
Edit2->Text=conv(CutString(Edit1->Text)) " = " stack.node->data;
發表人 - ccobj 於 2005/04/09 11:57:52
king917018
一般會員


發表:3
回覆:1
積分:0
註冊:2005-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-09 12:04:51 IP:218.175.xxx.xxx 未訂閱
謝謝大大們的指導~~真是感激不進~~不過你PO的程式碼我看不大董而且還有錯~~不好意思麻煩你哦~我知道要有另外一個運算元的堆疊但...就是一直有錯所以想問問看~~謝謝
系統時間:2024-05-19 13:04:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!