習題3 11 表示式轉換 25分

2021-10-01 15:23:11 字數 3426 閱讀 8322

算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。

輸入在一行中給出不含空格的中綴表示式,可包含+-*\以及左右括號(),表示式不超過20個字元。

在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。

2+3*(7-4)+8/4
2 3 7 4 - * + 8 4 / +
#include

#include

#include

#define error - 1

#define maxlenth 100

#define maxsize 20

typedef char elementtype;

typedef struct snode* ptrtosnode;

struct snode

elementtype data;

ptrtosnode next;    

typedef ptrtosnode mystack;

bool isempty(mystack ms);

mystack create();

bool pushdata(mystack ms, elementtype x);

elementtype popdata(mystack ms);

int oprtodig(char ch);

int oprtodig(char ch)

int val;

switch (ch)

case '+':

val = 1;

break;

case '-':

val = 1;

break;

case '*':

val = 2;

break;

case '/':

val = 2;

break;

case '(':

val = 0;

break;

case ')':

val = 0;

break;

default:

printf("%c is invalid charn", ch);

break;

return val;

mystack create()

mystack ms = (mystack)malloc(sizeof(struct snode));

ms->next = null;

return ms;

bool isempty(mystack ms)

return (ms->next == null);

bool isfull(mystack ms)

return (ms->next == maxsize - 1);

bool pushdata(mystack ms,elementtype x)

bool rlt = false;

ptrtosnode tmpcell = (ptrtosnode)malloc(sizeof(struct snode));

tmpcell->data = x;

tmpcell->next = ms->next;

ms->next = tmpcell;

rlt = true;

return rlt;

elementtype popdata(mystack ms)

if(isempty(ms))

printf("empty stcak.\n");

return error;

else

elementtype rlt = ms->next->data;

ptrtosnode tmpcell;

tmpcell = ms->next;

ms->next = tmpcell->next;

free(tmpcell);

return rlt;

int main()

bool flag = false;

bool isfirst = true;

mystack stk = create();

char exrn[maxlenth];

gets(exrn);

int i = 0;

while(exrn[i]!='\0')

if(((i==0) && (exrn[i]=='-'||exrn[i]=='+')) || ((exrn[i]>='0' && exrn[i]<='9')||exrn[i]=='.') || ((exrn[i]=='-'||exrn[i]=='+')&&exrn[i-1]=='('))

if(flag && !isfirst)

printf(" ");

flag = false;

isfirst = false;

if(exrn[i] == '+')

i++;

printf("%c", exrn[i]);

i++;

while((exrn[i]>='0' && exrn[i] <= '9')|| exrn[i] == '.')

printf("%c",exrn[i++]);

continue;

else

flag = true;

if(exrn[i] == '(')

pushdata(stk,exrn[i]);

else if(exrn[i] == ')')

elementtype ch;

while((ch = popdata(stk))!='(')

printf(" %c",ch);

else

if(isempty(stk))

pushdata(stk,exrn[i]);

else

if( oprtodig(exrn[i]) > oprtodig(stk->next->data))

pushdata(stk,exrn[i]);

else if(oprtodig(exrn[i]) <= oprtodig(stk->next->data))

doprintf(" %c", popdata(stk));

while( (stk->next!=null)&&(oprtodig(exrn[i]) <= oprtodig(stk->next->data)) );

pushdata(stk,exrn[i]);

i++;

while(!isempty(stk))

printf(" %c", popdata(stk));

system("pause");

3 11 表示式轉換 25分

算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...

表示式轉換 25 分

首先規定優先順序,括號為最高優先順序,乘號或除號為次優先順序,加或減號為最低優先順序,至於數字,碰到就直接輸出即可。既然是數字,就有小數,整數,正數,負數之分,還有關於二元運算子的輸出,在括號內的二元運算子優先輸出,優先順序高的優先輸出 當然括號不算啊 根據題意,在輸出時可分為以下幾種情況。incl...

習題3 11 表示式轉換 刷題筆記

算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...