數據結構實驗-一元表達式

數據結構實驗-棧和隊列的定義和應用
實驗內容:
計算用戶輸入的簡單表達式的值:
例如(5+2)*3。即輸入的表達式中數字爲一位整數即可。
代碼:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

typedef struct
{
char *base;//申請一個空間
char *top;//棧頂元素下一個
int size;//容量
}SStack;//棧

int InitStack(SStack &S1)
{

S1.base=(char *)malloc(100*sizeof(char));
if(!S1.base) return 0;
S1.top=S1.base;
S1.size=100;
return 1;

}///建立一個棧

int Push(SStack &S1, char e)
{
if(S1.top-S1.base==S1.size) return 0;
*S1.top=e;
S1.top++;
return 1;
}///棧進元素

int StackEmpty(SStack S1)
{
if(S1.base==S1.top) return 1;
}///數字棧判斷是否空

int Pop(SStack &S1, char &e)
{
if(StackEmpty(S1)) return 0;
e=*(S1.top-1);
S1.top–;
return 1;
}///棧彈出元素

char Gettop(SStack S1)
{
if(StackEmpty(S1)) return 0;
return *(S1.top-1);
}///取出數字棧棧頂

int In(char c)
{
if(c<=‘9’&&c>=‘0’) return 1 ;
else return 0 ;
}///判斷c爲運算符還是數字

char Precede(char a,char c)
{
int i,j;
char op[7][7]={ {’>’,’>’,’<’,’<’,’<’,’>’,’>’},
{’>’,’>’,’<’,’<’,’<’,’>’,’>’},
{’>’,’>’,’>’,’>’,’<’,’>’,’>’},
{’>’,’>’,’>’,’>’,’<’,’>’,’>’},
{’<’,’<’,’<’,’<’,’<’,’=’,’\0’},
{’>’,’>’,’>’,’>’,’\0’,’>’,’>’},
{’<’,’<’,’<’,’<’,’<’,’\0’,’=’},};

switch(a)
{
case ‘+’:i=0;break;
case ‘-’:i=1;break;
case ‘*’:i=2;break;
case ‘/’:i=3;break;
case ‘(’:i=4;break;
case ‘)’:i=5;break;
case ‘#’:i=6;break;
}

switch©
{
case ‘+’:j=0;break;
case ‘-’:j=1;break;
case ‘*’:j=2;break;
case ‘/’:j=3;break;
case ‘(’:j=4;break;
case ‘)’:j=5;break;
case ‘#’:j=6;break;
}

return op[i][j];
}///比較優先級

char Operate(int a,char op,int b)
{
int c;
a=a-‘0’;
b=b-‘0’;
switch(op)
{
case ‘+’: c=a+b; break;
case ‘-’: c=a-b; break;
case ‘’: c=ab; break;
case ‘/’: c=a/b; break;
}
c=c+‘0’;
return c;
}///運算
int OperandType()
{
int y;
char a,b;
char c,x,op;
SStack S1,S2;
InitStack(S1);
InitStack(S2);Push(S2,’#’);
c=getchar();
while(c!=’#’||Gettop(S2)!=’#’)
{
if(In©==1)
{
Push(S1,c); c=getchar();
}
else
{
switch(Precede(Gettop(S2),c))
{
case’<’: //棧頂元素優先權低
Push(S2,c); c=getchar(); break;
case’=’: //脫括號接受下一字符
Pop(S2,x);c=getchar();break;
case’>’: //棧頂元素優先權高
Pop(S2,op);
Pop(S1,b); Pop(S1,a);
Push(S1,Operate(a,op,b));
break;
}//switch
}
}//while
y=Gettop(S1)-‘0’;
return y;
}///計算器
int main()
{
printf(“請輸入表達式\n”);
printf(“結果爲:%d”,OperandType());
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章