日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言逆波兰计算器程序,C语言实现的简单的逆波兰计算器

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言逆波兰计算器程序,C语言实现的简单的逆波兰计算器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前后調試了好幾天,類型轉換問題頗為麻煩,無賴使用兩種不同類型的棧解決,但程序目前還有兩個問題:

1.目前不能進行float類型的計算;

2.不能進行多位數的運算。

實際上就是目前只能進行個位數的帶括號的加減乘除運算,目前只能寫到這一步,期待后續改進。

#include

#include

#include

#define CAPACITY 50

typedef struct stack

{

int top;

char arr[CAPACITY];

}*pStack,stack;

pStack initStack1()

{

pStack st = (pStack)malloc(sizeof(stack));

st->top = 0;

return st;

}

int stackEmpty1(pStack st)

{

return(st->top <= 0);

}

int stackFull1(pStack st)

{

return(st->top >= CAPACITY);

}

int pushStack1(pStack st, char a)

{

if(stackFull1(st))

{

printf("棧滿!\n");

return 0;

}

else

{

st->arr[st->top++] = a;

return 1;

}

}

char popStack1(pStack st)

{

char a;

if(stackEmpty1(st))

{

printf("???\n");

return 0;

}

else

{

a = st->arr[--st->top];

return a;

}

}

char getTop1(pStack st)

{

if(!stackEmpty1(st))

return st->arr[st->top-1];

else

printf("Empty stack");

return 0;

}

typedef struct

{

int top;

int data[CAPACITY];

}*dataStack;

dataStack initStack2()

{

dataStack st = (dataStack)malloc(sizeof(dataStack));

st->top = 0;

return st;

}

int stackEmpty2(dataStack st)

{

return(st->top <= 0);

}

int stackFull2(dataStack st)

{

return(st->top >= CAPACITY);

}

int pushStack2(dataStack st, int data)

{

if(stackFull2(st))

{

printf("棧滿!\n");

return 0;

}

else

{

st->data[st->top++] = data;

return 1;

}

}

int popStack2(dataStack st)

{

int data;

if(stackEmpty2(st))

{

printf("???\n");

return 0;

}

else

{

data = st->data[--st->top];

return data;

}

}

int getTop2(dataStack st)

{

if(!stackEmpty2(st))

return st->data[st->top-1];

else

printf("Empty stack");

return 0;

}

int priority(char op)

{

switch(op)

{

case '*':

case '/':return 2;

case '+':

case '-':return 1;

default: return 0;

}

}

int myAtoi(char a)

{

return a-'0';

}

int main(void)

{

int p = 0;

int i = 0;

int j;

int result, tmp1, tmp2;

char ch, temp;

char infix[CAPACITY] = "\0";

char output[CAPACITY];

pStack st = initStack1();

dataStack st2 = initStack2();

printf("請輸入中綴表達式:");

scanf("%s", &infix);

printf("后綴表達式為:");

for(ch = infix[p];ch !='\0';ch = infix[++p])

{

switch(ch)

{

case '(':pushStack1(st,ch);break;

case ')':

{

while(getTop1(st) != '(')

{

output[i++] = getTop1(st);

printf("%c", popStack1(st));

}

popStack1(st);

break;

}

case '+':

case '-':

case '*':

case '/':

{

while(!stackEmpty1(st))

{

temp = getTop1(st);

if(priority(temp) >= priority(ch))

{

output[i++] = temp;

printf("%c", popStack1(st));

}

else

{

break;

}

}

pushStack1(st, ch);

break;

}

default:output[i++] = ch,printf("%c",ch);

}

}

while(!stackEmpty1(st))

{

temp = popStack1(st);

output[i++] = temp;

if(temp == '(')

{

printf("表達式有誤!");

exit(EXIT_FAILURE);

}

printf("%c", temp);

printf("\n");

}

output[i] = '\0';

free(st);

for(j=0;j

{

switch(output[j])

{

case'+':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp1 + tmp2;pushStack2(st2, result);break;

case'-':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp2 - tmp1;pushStack2(st2, result);break;

case'*':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp2 * tmp1;pushStack2(st2, result);break;

case'/':tmp1 = popStack2(st2);tmp2 = popStack2(st2);result = tmp2 / tmp1;pushStack2(st2, result);break;

default:pushStack2(st2,myAtoi(output[j]));break;

}

}

printf("輸出結果為: %d\n", getTop2(st2));

return 0;

}兩種堆??梢杂梅盒蛯崿F共用函數,目前還不清楚怎么實現。

總結

以上是生活随笔為你收集整理的c语言逆波兰计算器程序,C语言实现的简单的逆波兰计算器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。