0
#include "cstack.h"
#include <iostream>
#include <cstring>
using namespace std;

bool isValidExpression (CStack&, char*);

int main (void)
{
   char expression[21];
   expression[0-21]=0;
   cout<< "Enter an expression: ";
   cin >>expression;
   CStack stack1;

   if (isValidExpression (stack1, expression)==true)
   {
      cout << "\nIt's a valid expression";
   }
   else
   {
      cout << "\nIt's NOT a valid expression";
   }
   return 0;
}

bool isValidExpression (CStack& stackA, char* strExp)
{


   for(int a=0;a<21 && strExp[a]!=0;a++)
   {
      cout<<"Action A" <<endl;
      stackA.push(strExp[a]);
   }
   /*if(strExp[a]=='}'||strExp[a]==']'||strExp[a]==')')
     {

     }
     else*/

   if(strExp[stackA.Top()]=='['||strExp[stackA.Top()]=='{'||strExp[stackA.Top()]=='(')
   {
      return false;
   }

   for(int a=stackA.Top();a>0;a--)
   {
      if(strExp[a]=='['||strExp[a]=='{'||strExp[a]=='(')
      {
         stackA.pop();
      }
      else if(strExp[a]==']')
      {
         for(int g=stackA.Top();g>0;g--)
         {
            if(strExp[a-1]=='[' && strExp[a-1]!=0)
            {
               stackA.pop();
               g--;
               break;
            }
            else if(strExp[a-1]==0)
            {
               return false;
            }
         }
      }
      else if(strExp[a]=='}')
      {
         for(int g=stackA.Top();g>0;g--)
         {
            if(strExp[a-1]=='{' && strExp[a-1]!=0)
            {
               stackA.pop();
               break;
            }
            else if(strExp[a-1]==0)
            {
               return false;
            }
         }
      }
      else if(strExp[a]==')')
      {
         for(int g=stackA.Top();g>0;g--)
         {
            if(strExp[a-1]=='(' && strExp[a-1]!=0)
            {
               stackA.pop();
               break;
            }
            else if(strExp[a-1]==0)
            {
               return false;
            }
         }
      }
   }
   return true;
}

このプログラムで私がやろうとしているのは、次の文字で構成されるステートメントを入力することです: ],},),[,{,(. すべての文字がこのように互いに接近しているステートメント ([]) (][) は真ではありません. [] は真です. [(]){{ は真ではありません.

このプログラムは C++ で書かれており、文字列ではなく C 文字列を使用する必要があります。push、pop、top などのスタック関数を使用する必要があります。現在のコードでは、[] は正しく、][ は正しくないと見なされますが、それ以上はすべての入力が正しいと見なされます。このコードは私がこれまでに持っているものです。助けていただければ幸いです。

4

3 に答える 3

3
expression[0-21]=0;

そのステートメントは文字通り、配列の位置 -21 にアクセスし、それを 0 に設定することを意味します。これは、21 要素の配列の位置が 0 から 20 の範囲であるため、未定義の動作です (21 は -21 と同じくらい間違っていることに注意してください)。は範囲0-21ではなく、単一の値を生成する算術演算です。配列の初期化が必要な場合は、定義で行うことができます。

char expression[21] = {};

または、ループまたはmemset(この場合、配列に格納されている型が POD の場合)などの他の手段によって

于 2013-03-15T04:02:26.083 に答える
1

問題を必要以上に複雑にしていると思います。実装に関するヒント:

1. You shouldn't use `stack` as an input for the testing function, 
    that makes no sense, just use it locally.
2. You can scan over the whole expression and push some characters,
   if meet another characters, just check if the stack content meets the requirements,
   if not, invalid expression, say `1+(2*3)`, when `)` is met, we should just found
   a corresponding `(`.

コピーする完全なコードを提供することは役に立たないことに気付きました。自分でもっとよく考えてください。がんばってください! :)

于 2013-03-15T04:12:05.667 に答える
0

これは、自分で解決できるはずの単純な問題です。ただし、これがガイドとなるアルゴリズムです(もちろん、完全に間違っているため、コードは記述しません)。

  1. 各ステップで要素をスタックにプッシュしながら、入力を中間点から最後までトラバースします。
  2. 各ステップで、入力を開始から中間点までトラバースし、要素をスタックからポップして、入力要素と比較します。
  3. スタック要素が「]」で入力要素が「[」の場合は、続行します。受け入れられた各区切り文字タイプを確認し、それらが適切な方向に一致する場合は続行します。それらが適切に一致しない場合は失敗します。受け入れられる区切り文字タイプではない要素を無視します。

中点を処理するために、ここで少し理解する必要があります(それを計算する方法、および偶数/奇数の要素を処理する方法など)。良い答えと悪い答えを作り、最初に紙でアルゴリズムをテストすることをお勧めします。幸運を!

于 2013-03-15T04:22:08.730 に答える