2016-05-02 4 views
0

接頭辞文字列を中置文字に変換するコードがあります。私はスタックスタックを使用しています。 テスト入力:*/AB + -cdeSTL stack top()関数は、pop()の後でも同じ値を読み取ります。

#include<iostream> 
#include<stack> 
#include<string.h> 
#include<stdlib.h> 
using namespace std; 
int main() 
{ 
    stack<char*> s; 
    char prefix[100],c; 
    int l,i,flag[27]={0},pos; 
    char *o1,*o2,*op,temp[10]; 
    cout<<"Prefix expression : "; 
    cin>>prefix; 
    l=strlen(prefix); 
    op=(char *)malloc(sizeof(char)*10); 
    o1=new char[10]; 
    o2=new char[10]; 
    for(i=l-1;i>=0;i--) 
    { 
     if(prefix[i]>=97 && prefix[i]<=122) 
     { 
      if(i!=l-1) cout<<s.top()<<endl; 
      cout<<"Operand"<<endl; 
      temp[0]=prefix[i]; 
      temp[1]='\0'; 
      strcpy(op,temp); 
      s.push(op); 
     } 
     else 
     { 
      cout<<"Operator"<<endl; 
      cout<<"Top element : "<<s.top()<<endl; 
      o1=s.top(); 
      strcpy(temp,o1); 
      s.pop(); 
      cout<<"Top element : "<<s.top()<<endl; 
      temp[strlen(temp)]=prefix[i]; 
      o2=s.top(); 
      strcat(temp,o2); 
      s.pop(); 
      temp[strlen(temp)]='\0'; 
      //cout<<o1<<" "<<o2<<endl; 
      strcpy(op,temp); 
      s.push(op); 
      cout<<op<<endl; 
     } 
    } 
    o1=s.top(); 
    s.pop(); 
    cout<<"Evaluated expression is "<<o1<<endl; 
    return 0; 
} 

今O1は、最初のオペランドが検出されるとO2をdを格納することになっている場合、Cを記憶するようになっています。次のように しかし、私が得る出力は、

Output

で誰かが助けてくださいことはできますか?私はあなたのコードで表示さ

+2

あなたは本当に[ 'のstd :: STRING'](http://en.cppreference.com/w/cpp/string/basic_string)sを使用する必要があります。 – NathanOliver

+0

出力を質問に追加します。 –

+0

しかし、私はスタックを使用し、無作為にs.push( "hello")などを挿入するとうまく動作します。 – Sahitya

答えて

1

問題:

あなたは、ループの開始前opためのメモリを割り当てたループ

opを再利用。

op=(char *)malloc(sizeof(char)*10); 

そして、同じメモリをforループで使用しています。

 strcpy(op,temp); 
     s.push(op); 

elseブロック内:ifブロック内

 strcpy(op,temp); 
     s.push(op); 

毎回opのメモリを割り当てる必要があります。

nullがelseブロックで

を終了していない文字列でstrcatを使用して、あなたが持っている:

 temp[strlen(temp)]=prefix[i]; 
     o2=s.top(); 
     strcat(temp,o2); 

これらの行の最初はprefix[i]tempのヌル文字を置き換えます。その時点で、tempはヌル終了文字列ではありません。上の3行目のstrcatの呼び出しは、未定義の動作につながります。あなたはの線に沿って何かを使用する必要があり

mallocnewをミキシングmallocnew

をミキシング

 char temp2[2] = {0}; 
     temp2[0] = prefix[i]; 
     strcat(temp, temp2); 
     o2=s.top(); 
     strcat(temp,o2); 

は、あなたが見ているメモリの問題の原因ではありませんが、それは良いですあなたがC++の土地にいるので、newを使うことに固執する。

は、ここで修正して、あなたのプログラムのバージョンです:

#include<iostream> 
#include<stack> 
#include<string.h> 
#include<stdlib.h> 
using namespace std; 
int main() 
{ 
    stack<char*> s; 
    char prefix[100]; 
    int l,i; 
    char *o1,*o2,*op,temp1[10],temp2[10]; 
    cout<<"Prefix expression : "; 
    cin>>prefix; 
    l=strlen(prefix); 
    o1=new char[10]; 
    o2=new char[10]; 
    for(i=l-1;i>=0;i--) 
    { 
     if(prefix[i]>=97 && prefix[i]<=122) 
     { 
     if(i!=l-1) cout<<s.top()<<endl; 
     cout<<"Operand"<<endl; 
     temp1[0]=prefix[i]; 
     temp1[1]='\0'; 
     op = new char[10]; 
     strcpy(op,temp1); 
     s.push(op); 
     cout<<"Symbol"<<endl; 
     cout<<"Top element : "<<s.top()<<endl; 
     } 
     else 
     { 
     cout<<"Operator"<<endl; 
     cout<<"Top element : "<<s.top()<<endl; 
     o1=s.top(); 
     strcpy(temp1,o1); 
     s.pop(); 
     cout<<"Top element : "<<s.top()<<endl; 
     temp2[0]=prefix[i]; 
     temp2[1]='\0'; 

     strcat(temp1,temp2); 
     o2=s.top(); 
     strcat(temp1,o2); 
     s.pop(); 
     op = new char[10]; 
     strcpy(op,temp1); 
     s.push(op); 
     cout<<op<<endl; 
     } 
    } 
    o1=s.top(); 
    s.pop(); 
    cout<<"Evaluated expression is "<<o1<<endl; 
    return 0; 
} 

更新

あなたはstd::string代わりのchar*を使用して、文字列のメモリを割り当て、割り当て解除の手間を避けることができます。文字列を扱うとき

#include <iostream> 
#include <string> 
#include <stack> 
#include <cstring> 

using namespace std; 

void test(char prefix[]) 
{ 
    stack<std::string> s; 
    int l,i; 
    char temp[10] = {0}; 
    std::string op; 

    l = std::strlen(prefix); 
    for(i=l-1;i>=0;i--) 
    { 
     if(prefix[i]>=97 && prefix[i]<=122) 
     { 
     if(i!=l-1) cout<<s.top()<<endl; 
     cout<<"Operand"<<endl; 
     temp[0]=prefix[i]; 
     s.push(temp); 
     cout<<"Symbol"<<endl; 
     cout<<"Top element : "<<s.top()<<endl; 
     } 
     else 
     { 
     cout<<"Operator"<<endl; 
     cout<<"Top element : "<<s.top()<<endl; 

     op = s.top(); 
     s.pop(); 

     cout<<"Top element : "<<s.top()<<endl; 
     temp[0]=prefix[i]; 

     op += temp; 

     op += s.top(); 
     s.pop(); 

     s.push(op); 
     cout<<op<<endl; 
     } 
    } 
    op=s.top(); 
    s.pop(); 
    cout<<"Evaluated expression is "<<op<<endl; 
} 

int main() 
{ 
    char prefix[100]; 
    cout<<"Prefix expression : "; 
    cin>>prefix; 
    test(prefix); 
    return 0; 
} 
関連する問題