#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef char SElemType;
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status Push(SqStack &S, SElemType &e);
Status Pop(SqStack &S, SElemType &e);
Status GetTop(SqStack S, SElemType &e);
Status Matching(SqStack &S, char expression[]);
int StackLength(SqStack S);
int main(){
SqStack S;
InitStack(S);
printf("以下是表达式的转换");
char expression[] = "a+b/c-(d*e+f)*g";
printf("%s\n", expression);
Matching(S, expression);
return 0;
}
Status InitStack(SqStack &S){
S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base)
{
exit(OVERFLOW);
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
int StackLength(SqStack S){
return S.top - S.base;
}
Status GetTop(SqStack S, SElemType &e){
if (S.top == S.base){
return ERROR;
}
e = *(S.top - 1);
return OK;
}
Status Push(SqStack &S, SElemType &e){
if (S.top - S.base >= S.stacksize){
S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S.base){
exit(OVERFLOW);
}
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
Status Pop(SqStack &S, SElemType &e){
if (S.top == S.base){
return ERROR;
}
e = *--S.top;
return OK;
}
Status Matching(SqStack &S, char expression[]){
int index, flag = 0;
char e;
for (index = 0; expression[index] != '\0'; index++){
switch (expression[index]){
case '+':
case '-':
flag = 1;
GetTop(S, e);
if (StackLength(S) == 0 || e == '(' ){
Push(S, expression[index]);
break;
}
else{
while (Pop(S, e)){
printf("%c ", e);
GetTop(S, e);
if (StackLength(S) == 0 || e == '('){
Push(S, expression[index]);
flag = -1;
break;
}
}
if (flag == 1){
Push(S, expression[index]);
}
break;
}
case '*':
case '/':
flag = 1;
GetTop(S, e);
if (StackLength(S) == 0 || e == '(' || e == '+' || e == '-'){
Push(S, expression[index]);
break;
}
else{
while (Pop(S, e)){
printf("%c ", e);
GetTop(S, e);
Push(S, expression[index]);
flag = -1;
break;
}
if (flag == 1){
Push(S, expression[index]);
}
break;
}
case '(':
flag = 1;
Push(S, expression[index]);
break;
case ')':
flag = 1;
if (StackLength(S)){
while (Pop(S, e)){
printf("%c ", e);
GetTop(S, e);
if (e == '('){
Pop(S, e);
break;
}
}
break;
}
else
return ERROR;
default:
printf("%c ", expression[index]);
}
}
if (StackLength(S) != 0){
while (Pop(S, e)){
printf("%c ", e);
}
}
return OK;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人