算法:检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。出现非括号字符则跳过。
#include"Stack.h"
int main()
{
Stack S;
int i = 0;
char str[MAX_SIZE];
printf("请输入表达式:");
gets(str);//从控制台获取字符串赋值给str(ascll码形式)
StackInit(&S);
for(i = 0;i<strlen(str);i++)
{
if(str[i] == '(' || str[i] == '{'|| str[i] == '[' )
{
StackPush(&S, str[i]);
}
else if(str[i] == ')' && StackTop(&S) == '(')
{
StackPop(&S);
}
else if(str[i] == '}' && StackTop(&S) == '{')
{
StackPop(&S);
}
else if(str[i] == ']' && StackTop(&S) == '[')
{
StackPop(&S);
}
else
{
i++;
}
}
if(StackEmpty(&S))
{
printf("括号匹配!\n");
}
else
{
printf("括号不匹配!\n");
}
return 0;
system("pause");
}
#include"Stack.h"
void StackInit(Stack* S)
{
S->_bottom = S->_top = 0;
S->len = 0;
}
void StackPush(Stack* S, DataType data)
{
if(S->len == MAX_SIZE)
{
printf("栈满溢出,添加失败!\n");
return;
}
S->_top++;
S->_arr[S->_top] = data;
S->len++;
printf("入栈成功!!\n",data);
}
void StackPop(Stack* S)
{
if(S->len == 0)
{
printf("栈为空!!!\n");
return;
}
//printf(" %d 出栈\n",S->_arr[S->_top]);
S->_top--;
S->len--;
//printf("此时栈顶元素为:%d\n",S->_arr[S->_top]);
}
DataType StackTop(Stack* S)
{
int ret = 0;
if(S->len == 0)
{
printf("栈为空!\n");
return;
}
ret = S->_arr[S->_top];
return ret;
}
int StackSize(Stack* S)
{
int ret = 0;
ret = printf("栈中元素个数为:%d\n",S->len);
return ret;
}
int StackEmpty(Stack* S)
{
if(S->len == 0 )
{
printf("栈为空!!\n");
return 1;
}
else
{
printf("栈不为空\n");
return 0;
}
}
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int DataType;
#define MAX_SIZE 100
typedef struct Stack
{
DataType _arr[MAX_SIZE];//栈的元素最大个数
int _top;//栈顶
int _bottom;//栈低
int len;//栈大小
}Stack;
void StackInit(Stack* S);
void StackPush(Stack* S, DataType data);
void StackPop(Stack* S);
DataType StackTop(Stack* S);
int StackSize(Stack* S);
int StackEmpty(Stack* S);