C用棧實現中綴表示式轉字尾表示式

2021-05-23 20:09:53 字數 3115 閱讀 3667

#include

#include

#include

#define maxsize 100 /*設順序表的最大長度為100,可依具體情況分配空間*/

typedef char datatype;

typedef struct

datatype data[maxsize];

int top;/*棧頂指標*/

}seqstack;/* 順序棧型別定義 */

/* 構造乙個空棧 */

seqstack *initstack()

seqstack *s;/* s為順序棧型別變數的指標*/

s=(seqstack *)malloc(sizeof(seqstack));

if(!s)

printf("空間不足/n");

return null;

else

s->top=-1;

return s;

/* 取棧頂元素 */

datatype gettop(seqstack *s)

if(s->top == -1)

printf("/n棧是空的!");

return 0;

else

return s->data[s->top];

/* 入棧 */

seqstack *push(seqstack *s,datatype x)

if(s->top == maxsize-1 )

printf("/n棧是滿的!");

return null;

else

s->top++;

s->data[s->top]=x;

return s;

/* 出棧 */

datatype pop(seqstack *s)

if(s->top == -1)

//printf("/n棧已經空了!");

return 0;

s->top--;

return s->data[s->top+1];

/* 判別空棧 */

datatype seqstackempty(seqstack *s)

if(s->top ==-1)

// printf("此棧是空棧!");

return 1;

else

// printf("此棧不是空棧!");

return 0;

void display(seqstack *p)

int t ;

t = p->top;

if(p->top==-1)

printf("/n此棧是空的");

else

while(t!=-1)

printf("%d->",p->data[t]);

t--;

/* 檢測括號是否配對 */

int checkbracket(char *str)

int i=0;

seqstack *p= initstack();

datatype ch;

while(str[i])

ch=str[i];

if(ch=='(')

push(p,ch); //遇到左括號入棧 

else

if(ch==')') 

if(pop(p)==0)  //遇到右括號出棧,如果棧為空,則表示式缺左括號 

return 0; 

i++;

return seqstackempty(p); //棧空則表示配對,棧不為空則表示缺右括號 

/*  判斷優先順序 */

char proceed(char left,char right)

/* 設定優先矩陣 */

char prioritymatrix[8]=,

int i,j;

for(i=0;i<8;i++)

if(prioritymatrix[i][0]==left) break;

for(j=0;j<8;j++)

if(prioritymatrix[0][j]==right) break;

return prioritymatrix[i][j];

int isnum(char str)

char oper=;

int temp,i;

for(i=0;i<10;i++)

{ if(oper[i]==str)

return 1;

return 0;

void post(char r)

char temp,str;

int j=0;

seqstack *s;

s=initstack();

push(s,'#');

str=r[j];

while(!(str=='#' && gettop(s)=='#'))

if(isnum(str))

printf("%c",str);

str=r[++j];

else

if(proceed(gettop(s),str)=='<')

push(s,str);

str=r[++j];

else

if(proceed(gettop(s),str)=='>')

temp=pop(s);

printf("%c",temp);

else

if(proceed(gettop(s),str)=='=' &&

gettop(s)=='(' && str==')')

temp=pop(s);

str=r[++j];

int main(void)

/* 此處新增你自己的** */

char str="3+1*(2+4)#";

printf("%s/n",str);  //列印字首 

if(checkbracket(str)==1) //判斷括號是否配對 

post(str); //處理成字尾並列印出來 

else

printf("brackets are not matched");

printf("/n");

system("pause"); 

return 0;

棧 中綴表示式轉字尾表示式

中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...

C 利用棧實現中綴表示式轉字尾表示式

題目 現有中綴表示式如 1 2 3 4 10 5 請用棧的特性編寫乙個程式,使得程式輸出字尾表示式 分析如下 step1 1 2 3 4 10 5 首先遇到第乙個輸入是數字1,數字在字尾表示式中都是直接輸出,接著是符號 入棧 step2 1 2 3 4 10 5 第三個字元是 依然是符號,入棧,接著...

利用棧實現中綴表示式轉字尾表示式

中綴表示法 或中綴記法 是乙個通用的算術或邏輯公式表示方法,操作符是以中綴形式處於運算元的中間 例 3 4 與字首表示式 例 3 4 或字尾表示式 例 3 4 相比,中綴表示式不容易被電腦解析,但仍被許多程式語言使用,因為它符合人們的普遍用法。逆波蘭表示法 reverse polish notati...