/*把压栈出栈函数都实现了*/
#include "stdio.h"
#include "assert.h"
#include "string.h"
#define STACKMAXSIZE 10002
typedef struct stack{
char buf[STACKMAXSIZE];
int top;
} Stack;
void StackInit(Stack* obj)
{
obj -> top = -1;
}
/*栈是否为空*/
bool Isempty(Stack* obj)
{
if(obj -> top == -1)
return true; //栈空
return false; //非空
}
/*栈是否为满*/
bool Isfull(Stack* obj)
{
if(obj -> top == STACKMAXSIZE - 1)
return true; //栈满
return false; //栈空
}
/*压栈*/
void PushStack(Stack* obj, char str)
{
assert(!Isfull(obj));//断言
obj->top ++;
obj->buf[obj -> top] = str;
}
/*出栈*/
void PopStack(Stack *obj, char *str)
{
assert(!Isempty(obj));
*str = obj->buf[obj->top];
obj->top--;
}
/*获取栈顶值*/
char gettop(Stack *obj)
{
assert(!Isempty(obj));
return obj->buf[obj->top];
}
int main(void)
{
Stack *stack = (Stack *)malloc(sizeof(Stack));
StackInit(stack);
char str[15] = "(){}[]{()}(}";
printf("%d\r\n",strlen(str));
for(int i = 0; i < strlen(str); i++)
{
char c = str[i];
if(c == '(' || c == '[' || c == '{')
PushStack(stack,c); //进栈
else
{
if(Isempty(stack)) /*字符为空*/
{
printf("NO\r\n");
return 0;
}
char topchar;
PopStack(stack,&topchar);
if(c == ')' && topchar != '(')
{
printf("NO\r\n");
return 0;
}
if(c == '}' && topchar != '{')
{
printf("NO\r\n");
return 0;
}
if(c == ']' && topchar != '[')
{
printf("NO\r\n");
return 0;
}
}
}
if(Isempty(stack))
{
printf("YES\r\n");
return 0;
}
else
{
printf("NO\r\n");
return 0;
}
return 0;
}
或者直接:
class Solution {
public:
bool isValid(string s) {
int n = s.size() ;
if(n == 0 || n % 2 != 0) /*字符个数为空或者不成对直接return false*/
return false;
char str[10005];
int top = -1;
for(int i = 0; i < s.size(); i++)
{
char c = s[i];
if(c == '(' || c == '{' || c == '[')
str[++top] = c;
else
{
if(top == -1) /*说明一开始为右边的部分,所以直接return false*/
return false;
char topc = str[top--];
if(c == '}' && topc != '{')
return false;
if(c == ')' && topc != '(')
return false;
if(c == ']' && topc != '[')
return false;
}
}
if(top == -1) //最后只有栈空了才说明都匹配上
return true;
return false;
}
};