栈的应用(就近匹配,逆波兰表达式)
先放一张clion设置截图,用于分割不同作用的文件,以及怎么定义路径和引用。
需要在main.c同级的CMakeLists.txt中定义source_file和header_file。
在CMakeLists.txt加入设置:
include_directories("source_file")
include_directories("header_file")
在source_file中对header_file中的文件进行实现,在头文件那里,可以通过相对路径引入,也可以通过CMakeLists.txt文件,设置。
这样就让clion中的C语言工程和visual studio中的一样了。注意,clion中,尽量不要用中文定义文件夹,容易出现路径寻找不到的问题。
括号匹配
#include <stdio.h>
#include "stackFinishByArray.h"
int isLeft(char ch){
return ch=='(';
}
int isRight(char ch){
return ch==')';
}
void printError(char *str,char *errMsg,const char *pos){
printf("错误的信息:%s\n",errMsg);
printf("%s\n",str);
//计算打印空格的数量
long long num = pos-str; //char型指针地址(占一个字节)相减
for (int i = 0; i < num; ++i) {
printf(" ");
}
printf("|\n");
}
void test01()
{
char *str = "5+5*(6)+*/3*1-(1+3(";
char *p =str; //定义一个指针指向字符串的头地址
seqStack myStack = init_Stack();
while (*p!='\0'){
//没有到字符串的终止符的时候
//判断是不是左括号
if(isLeft(*p)){
//
push_SeqStack(myStack,p);
}
//判断是不是右括号
if(isRight(*p)){
if(size_SeqStack(myStack)>0){
//栈不为空,弹出栈
pop_SeqStack(myStack);
} else{
//栈为空,直接报错,打印错误信息
printError(str,"右括号没有匹配到左括号",p);
break;
}
}
p++;
}
//判断是否为空栈
while (size_SeqStack(myStack)>0){
printError(str,"左括号没有匹配到右括号", top_SeqStack(myStack));
pop_SeqStack(myStack);
}
}
int main() {
test01();
//printf("Hello, World!\n");
return 0;
}
中缀转后缀表达式
算法流程
中缀表达式 转后缀表达式
可以利用自己已经实现的栈
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#define MAX 1024
//
定义栈的结构体
//struct SStack{
// void * data[MAX]; //数组
// int m_Size;
//};
typedef void* seqStack;
//开始编写stack的接口
//初始化栈
seqStack init_Stack();
//入栈
void push_SeqStack(seqStack stack,void * data);
//出栈
void pop_SeqStack(seqStack stack);
//获取栈顶元素
void* top_SeqStack(seqStack stack);
//返回栈大小
int size_SeqStack(seqStack stack);
//判断栈是否为空(0为空,1非空)
int isEmpty(seqStack stack);
//销毁栈
void destroy_SeqStack(seqStack stack);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stackFinishByArray.h" //(1)../header_file/通过相对路径引入 (2)通过CMakeLists.txt 定义路径
#define MAX 1024
//定义栈的结构体
struct SStack{
void * data[MAX]; //数组
int m_Size;
};
typedef void* seqStack;
//开始编写stack的接口
//初始化栈
seqStack init_Stack(){
struct SStack *myStack=malloc(sizeof (struct SStack)); //先给管理栈的结构体开辟空间
if(myStack==NULL){
return NULL;
}
//清空数组中的每个元素
memset(myStack->data,0, sizeof(void*)*MAX); //将数组中的每个元素赋值为0
myStack->m_Size=0;
return myStack;
}