C/C++程序开发(04):使用栈技术实现10以内加减乘除算式的计算

头文件:

#ifndef _MYSTACK_H_

#define _MYSTACK_H_
#include <stdio.h>
#define SIZE 10
struct myStack{
int arr[SIZE];
int num;
};
//初始化函数
void myStack_Init(myStack* stk);
//清理函数
void myStack_deInit(myStack* stk);
//入栈函数
void myStack_push(myStack* stk, int num);
//出栈函数
int myStack_pop(myStack* stk);
//出栈函数(删除)
void myStack_top(myStack* stk, int num);
//检查栈是否为空
bool myStack_empty(myStack* stk);
//检查栈是否已满
bool myStack_full(myStack* stk);
//栈中元素个数
int myStack_Count(myStack* stk);

//测试函数
void testStack();
int myCalc();
#endif#include "myStack.h"

 

 

源文件:

void myStack_Init(myStack* stk)
{
stk->num = 0;
}

void myStack_deInit(myStack* stk)
{
stk->num = 0;
}

void myStack_push(myStack* stk, int num)
{
stk->arr[stk->num] = num;
(stk->num)++;
}
//出栈函数(删除)
int myStack_pop(myStack* stk)
{
int ret = stk->arr[stk->num - 1];
(stk->num)--;
return ret;
}
//出栈函数(不删除)
int myStack_top(myStack* stk)
{
return stk->arr[stk->num - 1];
}
//检查栈是否为空
bool myStack_empty(myStack* stk)
{
return stk->num == 0;
}
//检查栈是否已满
bool myStack_full(myStack* stk)
{
return stk->num == SIZE;
}
//栈中元素个数
int myStack_Count(myStack* stk)
{
return stk->num;
}


void testStack()
{
myStack stk = { 0 };
myStack_Init(&stk);
printf("IsEmpty:%d\n", myStack_empty(&stk));
printf("IsFull:%d\n", myStack_full(&stk));
myStack_push(&stk, 3);
myStack_push(&stk, 4);
myStack_push(&stk, 6);
myStack_push(&stk, 8);
printf("IsEmpty:%d\n", myStack_empty(&stk));
printf("Element Count:%d\n", myStack_Count(&stk));
printf("IsFull:%d\n", myStack_full(&stk));
printf("%d ", myStack_pop(&stk));
printf("%d ", myStack_pop(&stk));
printf("%d ", myStack_pop(&stk));
printf("%d ", myStack_pop(&stk));
printf("\n");
printf("IsEmpty:%d\n", myStack_empty(&stk));
}


int myCalc()
{
printf("请输入计算式(10以内加减乘除,算式不要带空格):\n");
char buf[255] = { 0 };
fgets(buf, 255, stdin);
char* p_ch = buf;
myStack stk = { 0 };
myStack_Init(&stk);
int num = 0, num1 = 0, ptr = 0;
while (1)
{
if (*p_ch >= '0' && *p_ch <= '9')
{
myStack_push(&stk, *p_ch - '0');
}else if (*p_ch == '\n')
{
if (myStack_Count(&stk) == 3)
{
num1 = myStack_pop(&stk);
ptr = myStack_pop(&stk);
num = myStack_pop(&stk);
if (ptr == '-') myStack_push(&stk, num - num1);
if (ptr == '+') myStack_push(&stk, num + num1);
}
break;
}else if (*p_ch == '*' || *p_ch == '/')
{
num = myStack_pop(&stk);
num1 = *(p_ch + 1) - '0';
if (*p_ch == '*') myStack_push(&stk, num * num1);
if (*p_ch == '/') myStack_push(&stk, num / num1);
p_ch++;
}
else if (*p_ch == '+' || *p_ch == '-')
{
if (myStack_Count(&stk) == 3)
{
num1 = myStack_pop(&stk);
ptr = myStack_pop(&stk);
num = myStack_pop(&stk);
if (ptr == '-') myStack_push(&stk, num - num1);
if (ptr == '+') myStack_push(&stk, num + num1);
}
myStack_push(&stk, *p_ch);
}
p_ch++;
}
printf("%d\n", myStack_pop(&stk));
return 0;

}

 

 

主函数:

#include "myStack.h"
#include <stdio.h>
int main()
{
myCalc();
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小薛引路

喜欢的读者,可以打赏鼓励一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值