#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...