6
  void PDA::parse(vector<string> words){
    for(int i=0; i<words.size();i++){//for each string in the input file
    string token=words[i];
    for(int j=0; j<token.length(); j++) //for each character in the string
      {
        char input=token[j];
        char matchingBracket=getMatchingBracket(input); //returns the matching bracket, should probably just have ( and [

        if(!stack[j]){//since j-1 when the index is 0 will cause an error
          if(stack[j-1]==matchingBracket){
            stack.pop();
          }else{
            stack.push(input);
          }

        }
  }
    accepted()?cout<<"The string "<<words[i]<<" is balanced and was accepted"<<endl : cout<<"The string "<<words[i]<<" is not balanced and was not accepted"<<endl;
}
}

これらのエラーが発生しています

PDA.cpp:25: error: no match for âoperator[]â in â((PDA*)this)->PDA::stack[j]â
PDA.cpp:26: error: no match for âoperator[]â in â((PDA*)this)->PDA::stack[(j - 1)]â

これらの行について

if(!stack[j]){//since j-1 when the index is 0 will cause an error
              if(stack[j-1]==matchingBracket){

std::stack を調べたところ、「デフォルトでは、特定のスタック クラスにコンテナ クラスが指定されていない場合、標準のコンテナ クラス テンプレート deque が使用される」ことがわかりました。deque を調べたところ、operator[] をサポートしていることがわかりました。これがスタックを宣言した方法です。このソース ファイルに対応するヘッダー ファイル。

#ifndef PDA_H
#define PDA_H
#include <stack>
#include <vector>
#include <deque>
class PDA{
 private:
  std::stack<char> stack;
 public:
  PDA();
  bool isEmpty();
  void parse(std::vector<std::string>);
  char getMatchingBracket(char);
  bool accepted();
};
#endif

私が見たように、 std::stack で operator[] を使用すると問題なく動作するはずです。何か案は?

4

3 に答える 3

13

std::stack基になるコンテナ タイプから継承するのではなく、完全に新しいインターフェイスに適応させます。基になるコンテナーは公開されません。それが本質的にアダプターのポイントであり、基本的な構造に関係なく同じである、より限定されたインターフェースを使用していることを保証std::stackstd::queueます。

とは言ってもstd::stack、サブクラスから基になるコンテナーを継承してアクセスすることはできます。というprotectedメンバーcです。

class my_stack : public std::stack< char > {
public:
    using std::stack<char>::c; // expose the container
};

int main() {
    my_stack blah;
    blah.push( 'a' );
    blah.push( 'b' );
    std::cout << blah.c[ 1 ]; 
}

http://ideone.com/2LHlC7

于 2012-11-17T07:21:48.463 に答える
6

この.top()メソッドを使用して、インデックス作成ではなく、スタックの一番上にあるものを確認する必要があります。


したがって、現在のコードの代わりに…

if(!stack[j]){//since j-1 when the index is 0 will cause an error
  if(stack[j-1]==matchingBracket){
    stack.pop();
  }else{
    stack.push(input);
  }
}

書きます

if(!stack.empty() && stack.top() == matchingBracket) {
    stack.pop();
} else {
    stack.push(input);
}
于 2012-11-17T07:30:32.607 に答える
4

スタックは、定義上、その要素へのランダム アクセスをサポートしていません。std::stack リファレンスを参照してください。

実際、あなたの場合、コンテナの選択は間違っています。(最上位のスタック要素だけでなく) 要素にランダムにアクセスする必要がある場合は、std::vector代わりに使用します。対応する操作はpush_back()、要素をスタックの一番上に配置する、スタックの一番pop_back()上から要素を抽出する、およびback()一番上のスタックの要素にアクセスすることです。

于 2012-11-17T07:23:07.453 に答える