C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*********************************************************
* 1 栈的应用案例 - 就近匹配 *
* 2 从第一个字符开始扫描,见普通字符时忽略 *
* 3 当遇见左括号时压入栈中 *
* 4 当遇见右括号时从栈中弹出栈顶符号,并进行匹配 *
* 匹配成功:继续读入下一个字符 *
* 匹配失败:立即停止,并报错 *
* 5 结束: *
* 栈为空 -- 没有错误 *
* 栈不为空-- - 报错 *
*********************************************************/
//********************栈型数据结构***********************
//设计栈 结构体
#define MAX 1024
struct SStack
{
void * data[MAX]; //栈的数组
int m_Size; //栈大小
};
//对外隐身结构体属性
typedef void * SeqStack;
//初始化栈
SeqStack init_SeqStack()
{
struct SStack * myStack = malloc(sizeof(struct SStack));
if (myStack == NULL)
{
return NULL;
}
//初始化数组
memset(myStack->data, 0, sizeof(void *)* MAX);
//初始化栈大小
myStack->m_Size = 0;
return myStack;
}
//入栈
void push_SeqStack(SeqStack stack, void * data)
{
//入栈本质 --- 数组尾插
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct SStack * mystack = stack;
if (mystack->m_Size == MAX)
{
return;
}
mystack->data[mystack->m_Size] = data;
mystack->m_Size++;
}
//出栈
void pop_SeqStack(SeqStack stack)
{
//出栈本质 --- 数组尾删
if (stack == NULL)
{
return;
}
struct SStack * mystack = stack;
if (mystack->m_Size == 0)
{
return;
}
mystack->data[mystack->m_Size - 1] = NULL;
mystack->m_Size--;
}
//返回栈顶
void * top_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return NULL;
}
struct SStack * mystack = stack;
if (mystack->m_Size == 0)
{
return NULL;
}
return mystack->data[mystack->m_Size - 1];
}
//返回栈大小
int size_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return -1;
}
struct SStack * mystack = stack;
return mystack->m_Size;
}
//判断栈是否为空
int isEmpty_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return -1;//返回-1代表真 空栈
}
struct SStack * mystack = stack;
if (mystack->m_Size == 0)
{
return 1;
}
return 0; //返回0 代表 不是空栈
}
//销毁栈
void destroy_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return;
}
free(stack);
stack = NULL;
}
//********************用户区***********************
void printError(char* str , char* ErrMsg , char* pos)
{
printf("错误信息:%s\n" , ErrMsg);
//计算打印空格数量
int num = pos - str;
printf("%s\n" , str);
for (int i = 0; i < num; i++)
{
printf(" ");
}
printf("|\n");
}
int main()
{
char* str = "5+5*(6)+9/3*1)-(1+3(";
//char * str = "5+5*(6)+9/3*1-(1+3(";
char* p = str;
//初始化栈
SeqStack myStack = init_SeqStack();
while(*p != '\0')
{
//如果是左括号,入栈
if(*p == '(')
{
push_SeqStack(myStack , p);
}
//如果是左括号
if (*p == ')')
{
//栈中有元素,出栈
if (size_SeqStack(myStack))
{
pop_SeqStack(myStack);
}
else
{
//右括号没有匹配到对应的左括号,立即停止,并报错
printError(str , "右括号没有匹配到对应的左括号!" , p);
break;
}
}
p++;
}
//遍历结束 判断是否有 左括号没有匹配到对应的右括号
while(size_SeqStack(myStack))
{
printError(str, "左括号没有匹配到对应的右括号!!", top_SeqStack(myStack));
//出栈
pop_SeqStack(myStack);
}
system("pause");
return 0;
}