C语言数据结构学习(clion版本)

栈的应用(就近匹配,逆波兰表达式)

先放一张clion设置截图,用于分割不同作用的文件,以及怎么定义路径和引用。
在这里插入图片描述
需要在main.c同级的CMakeLists.txt中定义source_fileheader_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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值