stacks赋值如何左右匹配括号

时间:2013-10-01 06:49:38

标签: stack

我试图弄清楚如何完成这项任务已经过了一周。有点不清楚如何将我的if语句与堆栈连接起来。

这是我的代码,它由3个文件组成

分配问题是,括号和括号应该匹配,这意味着如果我们有左括号,那么应该是正确的一个,否则它会说无效。

我会非常高兴任何暗示或修复。

cstack.h文件

#include <iostream>

class FullStack{};

class EmptyStack{};


class cstack

{

private:
    int top;        // Index to top of the stack
    char data[21];      // The stack

public:
    cstack();       // Class constructor
    void Push(char);    // Push an item onto the stack
    void Pop();     // Pop an item from the stack
    bool Top();
    bool IsEmpty();     // Return true if stack is empty
    bool IsFull();      // Return true if stack is full


};

cstack.cpp文件

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



   cstack::cstack()
   {
top = -1;
   }

   bool cstack::IsEmpty()
   {
return (top == -1);
   }

   bool cstack::IsFull()
   {
return (top == 21);
   }

   void cstack::Push(char newItem)
   {
if (IsFull())
{
    throw FullStack();

}
top++;
data[top] = newItem;
    }


    void cstack::Pop()
    {
if(IsEmpty())
{
    throw EmptyStack();
}
top--;
    }


    bool cstack::Top()
    {
if (IsEmpty())
{
    throw EmptyStack();
}   

return data[top];

    }

test.cpp文件

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

   bool isValidExpression (cstack&, char*);

   int main (void)
   {    
char expression[21];
cstack stack1;

cout<< "Enter an expression: ";
cin >>expression;

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

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


for(int i = 0; i < 21 ; i++)
{   


     if( strExp[stackA.Top()] == '[' || strExp[stackA.Top()] == '{' ||                       strExp[stackA.Top()] == '(')
    {
        stackA.Push( strExp[i] );

    }



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



        if(strExp[i] == '[' && strExp[stackA.Top()] == ']')
        {
            return true;

        }else 

        {
        return false;


    }

}
}
return true;
    }

1 个答案:

答案 0 :(得分:0)

对于这个问题,你通常会这样做:

  • 从输入中获取每个字符
  • 推动堆叠上的每个开口支架
  • 如果你得到一个结束括号,请检查堆栈的顶部元素。
    • 如果该元素是右侧开口括号,则将其从堆栈中移除。
    • 如果该元素不是右侧的开括号,则返回false。

正如Nikhil在评论中提到的那样,normaly pop()应该返回弹出的元素,但在下面的代码中我使用了你的堆栈。

for(int i = 0; i < 21 ; i++)
{   


 if(strExp[i] == '[' || strExp[i] == '{' || strExp[i] == '(')
{
    stackA.Push( strExp[i] );

}



    if( strExp[i] == ']')
    {
       if(!stackA.IsEmpty && stackA.Top() == '[')
       {
         stackA.Pop();
       } else {
                return false;
       }
    }

    if( strExp[i] == '}')
    {
       if(!stackA.IsEmpty && stackA.Top() == '{')
       {
         stackA.Pop();
       } else {
                return false;
       }
    }

    if( strExp[i] == ')')
    {
       if(!stackA.IsEmpty && stackA.Top() == '(')
       {
         stackA.Pop();
       } else {
                return false;
       }
    }

}

return true;

编辑: 当我们找到匹配的右括号时使用'pop()',我们确保在堆栈顶部始终有最后打开的括号。您可以关闭该括号或打开另一个括号,但不能关闭先前的括号。

当您找到右括号并且堆栈为空时,会出现您所描述的错误。所以你必须先检查一下。 if(!stackA.IsEmpty && stackA.Top == '[')。查看我编辑的代码。 Normaly用这个代码“[]”应该是有效的,如果我发现另一个错误,我会双重检查并告诉你。