只想用一个栈解决,可惜一直解决不了,因为 * 的问题无法解决
看到标答用了两个栈,一个栈存储 ( 另一个栈储存 *
思路:当s[k] 为 ( 或 * 进栈 , 当s[k] 为 ) 时 , 优先左括号出栈(因为*有可能为空白字符) ,若左括号为空,则*作为(出栈 , 当s[k]为空时,并且左括号的栈也为空,则*作为空白字符,直接返回true , 当左括号的栈不为空时,则要依次比较栈顶元素的下标,并且此时'('出现的位置一定要在'*'的位置前面(因为此时要匹配成() )
下面的代码写的比较详细
题目链接:有效的括号字符串
typedef struct Stack
{
int* arr;
int rear;
int size;
}ST;
void STInit(ST* obj)
{
obj->arr = (int*)malloc(sizeof(int)*105);
obj->rear = -1;
obj->size = 0;
}
void STPush(ST* obj,int pos)
{
if( obj->size == 0 )
{
obj->arr[++obj->rear] = pos;
obj->size++;
return;
}
else
{
obj->arr[++obj->rear] = pos;
obj->size++;
return ;
}
}
bool CheckIsEmpty(ST* obj)
{
return obj->size == 0;
}
void StackPop(ST* obj)
{
obj->rear--;
obj->size--;
}
int StackTop(ST* obj)
{
return obj->arr[obj->rear];
}
bool checkValidString(char* s) {
ST Left_ST;
ST Star_ST;
STInit(&Left_ST);//初始化
STInit(&Star_ST);
for( int k = 0 ; s[k] != '\0' ; k++)
{
if( s[k] == '(' )
{
STPush(&Left_ST,k);//左括号进栈
}
else if( s[k] == '*' )
{
STPush(&Star_ST,k);//*进栈
}
else
{
if( !CheckIsEmpty(&Left_ST) )//判断左括号的栈是否为空
{
StackPop(&Left_ST);
}
else if( !CheckIsEmpty(&Star_ST) )
{
StackPop(&Star_ST);
}
else return false;
}
}
while( !CheckIsEmpty(&Left_ST) && !CheckIsEmpty(&Star_ST) )
{
int pos1 = StackTop(&Left_ST);
StackPop(&Left_ST);
int pos2 = StackTop(&Star_ST);
StackPop(&Star_ST);
if( pos1 > pos2 )return false;//比较下标
}
return CheckIsEmpty(&Left_ST);
}