完整代码+测试函数+括号匹配问题
目录
Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 100
typedef char DataType;
typedef struct
{
DataType stack[MaxSize];
int top;//top存储栈顶下标
}SeqStack;
//初始化堆栈
void StackInitiate(SeqStack* S);
//非空否
int StackNotNull(SeqStack S);
//入栈
int StackPush(SeqStack *S, DataType x);
//出栈
int StackPop(SeqStack* S, DataType* d);
//取栈顶元素
int StackGet(SeqStack S, DataType* d);
Stack.c
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include"Stack.h"
void StackInitiate(SeqStack* S)
{
S->top = 0;
}
int StackNotNull(SeqStack S)
{
if (S.top <= 0)
{
return 0;
}
else
{
return 1;
}
}
int StackPush(SeqStack* S, DataType x)
{
if (S->top >= MaxSize)
{
printf("堆栈已满");
return 0;
}
else
{
S->stack[S->top] = x;
S->top++;
return 1;
}
}
int StackPop(SeqStack* S, DataType* d)
{
if (S->top <= 0)
{
printf("堆栈为空");
return 0;
}
else
{
S->top--;
*d = S->stack[S->top];
return 1;
}
}
int StackGet(SeqStack S, DataType* d)
{
if (S.top <= 0)
{
printf("堆栈已空");
return 0;
}
else
{
*d = S.stack[S.top - 1];
return 1;
}
}
Test.c
#include<stdio.h>
#define MaxStackSize 100
typedef int DataType;
#include "Stack.h"
void main(void)
{
SeqStack myStack;
int i, x;
StackInitiate(&myStack);
for (i = 0; i < 10; i++)
{
StackPush(&myStack, i + 1);
}
StackGet(myStack, &x);
printf("当前栈顶元素为:%d\n", x);
printf("依次出栈的数列元素如下:\n");
while (StackNotNull(myStack))
{
StackPop(&myStack, &x);
printf("%d ", x);
}
}
ExpIsCorrect.c
#include<stdio.h>
#include<stdio.h>
#include<malloc.h>
#include"Stack.h"
void ExpIsCorrect(char exp[], int n)
//判断有n个字符的字符串exp左、右括号是否匹配
{
SeqStack myStack;
int i;
char c;
//初始化堆栈
StackInitiate(&myStack);
for (i = 0; i < n; i++) {
//如果为左半括号,入栈
if ((exp[i] == '(') || (exp[i] == '[') || (exp[i] == '{')) {
StackPush(&myStack,exp[i]);
}
//如果是右半括号
else if ((exp[i] == ')') && StackNotNull(myStack) && StackGet(myStack, &c) && c == '(') {
StackPop(&myStack, &c);
}
else if ((exp[i] == ')') && StackNotNull(myStack) && StackGet(myStack, &c) && c != '(') {
printf("左右括号不匹配\n");
return;
}
else if ((exp[i] == ']') && StackNotNull(myStack) && StackGet(myStack, &c) && c == '[') {
StackPop(&myStack, &c);
}
else if ((exp[i] == ']') && StackNotNull(myStack) && StackGet(myStack, &c) && c != '[') {
printf("左右括号不匹配\n");
return;
}
else if ((exp[i] == '}') && StackNotNull(myStack) && StackGet(myStack, &c) && c == '{') {
StackPop(&myStack, &c);
}
else if ((exp[i] == '}') && StackNotNull(myStack) && StackGet(myStack, &c) && c != '{') {
printf("左右括号不匹配\n");
return;
}
else if(((exp[i] == ')') || (exp[i] == ']') || (exp[i] == '}')) && !StackNotNull(myStack)){
printf("右括号多于左括号\n");
return;
}
}
if (StackNotNull(myStack)) {
printf("左括号多于右括号\n");
}
else
printf("左右括号匹配正确\n");
}
void main(void)
{
char a[] = "(())abc{[]()}";
char b[] = "(()))abc{[]}";
char c[] = "(()()abc{[]}";
char d[] = "(())abc{[]}";
int n1 = strlen(a);
int n2 = strlen(b);
int n3 = strlen(c);
int n4 = strlen(d);
ExpIsCorrect(a, n1);
ExpIsCorrect(b, n2);
ExpIsCorrect(c, n3);
ExpIsCorrect(d, n4);
}