转换后缀表达式
3.0版本
// 原作者:庞有伟
#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[]);
Status IsValid(char expression[]);
int StackLength(SqStack S);
int main(){
SqStack S;
InitStack(S);
char expression[20];
printf("以下是表达式的转换\n");
//char expression[] = "a+b/c-(d*e+f)*g";
printf("请输入表达式:\n");
scanf("%s", expression);
IsValid(expression);
printf("后缀表达式为:\n");
Matching(S, expression);
printf("\n");
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;
}
//不可以用S.top - 1,因为这里只是读取,并非删除
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;
}
//e作为栈顶元素,先赋值,再向上移动
*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[]){
//"a+b/c-(d*e+f)*g"
//abc/+de*f+g*-
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);
//栈空时退出循环
//出栈并不是全出,只在前面的优先级小的时候出,直到够大的时候,就push()
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;
}
Status IsValid(char expression[]){
int index_isvalid;
for (index_isvalid = 1; expression[index_isvalid] != '\0'; index_isvalid++){
if (expression[index_isvalid - 1] == expression[index_isvalid]){
printf("请不要输入连续相同的多个字符\n");
exit(ERROR);
}
if (!((expression[index_isvalid] >= 'a' && expression[index_isvalid] <= 'z') ||
(expression[index_isvalid] >= 'A' && expression[index_isvalid] <= 'Z') ||
(expression[index_isvalid] >= '0' && expression[index_isvalid] <= '9') ||
expression[index_isvalid] == '+' || expression[index_isvalid] == '-' ||
expression[index_isvalid] == '*' || expression[index_isvalid] == '/')){
printf("请不要输入非表达式合法字符\n");
exit(ERROR);
}
}
return OK;
}
2.0版本
#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);
char expression[20];
printf("以下是表达式的转换\n");
//char expression[] = "a+b/c-(d*e+f)*g";
printf("请输入表达式:\n");
scanf("%s", expression);
printf("后缀表达式为:\n");
Matching(S, expression);
printf("\n");
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;
}
//不可以用S.top - 1,因为这里只是读取,并非删除
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;
}
//e作为栈顶元素,先赋值,再向上移动
*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[]){
//"a+b/c-(d*e+f)*g"
//abc/+de*f+g*-
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);
//栈空时退出循环
//出栈并不是全出,只在前面的优先级小的时候出,直到够大的时候,就push()
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;
}
1.0版本
/*
栈采用顺序栈存储,试设计算法实现将表达式转换成后缀表达式输出。
例如,输入表达式: a+b/c-(d*e+f)*g
输出其后缀表达式: abc/+de*f+g*-
*/
#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;
}
//不可以用S.top - 1,因为这里只是读取,并非删除
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;
}
//e作为栈顶元素,先赋值,再向上移动
*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[]){
//"a+b/c-(d*e+f)*g"
//abc/+de*f+g*-
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);
//栈空时退出循环
//出栈并不是全出,只在前面的优先级小的时候出,直到够大的时候,就push()
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训练数据并当服务器共享给他人