1. 程式人生 > >使用棧技術實現10以內加減乘除算式的計算

使用棧技術實現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;
}