本文目錄一覽:
用c語言的棧來編寫逆波蘭公式的程序
如題,代碼如下,歡迎探討!!!
[code=C/C++][/code]
/*
表達式的後綴表示及其求值
*/
#include
stdio.h
typedef
int
ElemType;
/*
考慮到char型運算時的隱形提升會溢出,此處定義為int,代價僅浪費了內存空間
*/
#define
MAXNUM
16
struct
stack
{
ElemType
data[MAXNUM];
int
top;
};
void
StackInit(struct
stack
*stack)
{
int
i
=
0;
for(;i
MAXNUM;i++)
{
stack-data[i]
=
0;
}
stack-top
=
0;
/*
棧底部從索引0處開始
*/
}
void
StackPush(struct
stack
*stack,ElemType
c)
{
if(MAXNUM
==
stack-top)
/*
棧中元素最多有MAXNUM
–
1個
*/
{
printf(“The
stack
is
full
“);
return;
}
stack-data[stack-top++]
=
c;
}
ElemType
StackPop(struct
stack
*stack)
{
if(0
==
stack-top)
{
printf(“The
stack
is
empty
“);
/*
當棧空時,若返回0是錯誤的
*/
return
0;
}
return
stack-data[–stack-top];
}
void
PostfixEvaluation(struct
stack
*stack)
{
return;
/*
這個函數非常簡單了,所有的麻煩都已經解決了,我實在不想完成它
*/
}
int
ChangeToPostfix(char
*str)
{
int
i
=
0,flag
=
0;
/*
flag
用來標記連續數字的出現,沒想到好點的辦法
*/
int
c,ch;
struct
stack
ch_stack;
struct
stack
op_stack;
StackInit(ch_stack);
StackInit(op_stack);
while(
!=
(c
=
*(str
+
i)))
/*
此處需注意的是:如果是靜態的字符串,以為結束條件,如果是用戶輸入的,則以
’為結束條件
*/
{
if((*
==
c)
||
(/
==
c)
||
((
==
c))
{
flag
=
0;
StackPush(op_stack,c);
}
else
if()
==
c)
{
flag
=
0;
while((
!=
(c
=
StackPop(op_stack)))
{
StackPush(ch_stack,c);
}
if(0
==
op_stack.top)
{
printf(“the
(
hasnt
found
when
the
)
come
in!
“);
return
-1;
}
}
else
if((+
==
c)||
(-
==
c))
{
flag
=
0;
/*
+和-優先級低,運算符棧中的((如果存在)後的所有運算符需推出
*/
if(0
!=
op_stack.top)
/*
你可以不在此處添加top的檢查,那樣,你可以發現
StackPop錯誤返回的0被拾取了
*/
{
/*
被逼無奈,只得在此檢查top值,無法寄希望於StackPop了
*/
while((
!=
(ch
=
StackPop(op_stack)))
{
StackPush(ch_stack,ch);
if(0
==
op_stack.top)
{
break;
}
}
}
StackPush(op_stack,c);
}
else
if((c
=
0)
(c
=
9))
/*
對於表達式中2位或多位連續的數字,需特殊處理
*/
{
if(0
==
flag)
{
StackPush(ch_stack,(c
–
0));
flag
=
1;
}
else
{
StackPush(ch_stack,10
*
StackPop(ch_stack)
+
(c
–
0));
}
}
i++;
}
while(0
!=
op_stack.top)
/*
表達式處理結束,將運算符棧中的所有運算符推出並壓入字符棧
*/
{
StackPush(ch_stack,StackPop(op_stack));
}
PostfixEvaluation(ch_stack);
/*
該函數放在此處可能較為欠妥,可是,只要完成了任務不就OK了么,難道你會在乎?
*/
/*just
test
*/
for(i
=
0;i
ch_stack.top;i++)
{
if(+
==
ch_stack.data[i])
{
printf(“+..”);
}
else
if(-
==
ch_stack.data[i])
{
printf(“-..”);
}
else
if(*
==
ch_stack.data[i])
{
printf(“*..”);
}
else
if(/
==
ch_stack.data[i])
{
printf(“/..”);
}
else
{
printf(“%d..”,ch_stack.data[i]);
}
}
return
0;
}
int
main(void)
{
char
str[]
=
“12
+
34
*
435
–
5
/
1″;
/*
just
test
*/
printf(“The
result
should
be
:
“);
printf(“12
34
435
*
+
5
1
/
–
[=
8]
“);
if(-1
==
ChangeToPostfix(str))
{
printf(“ChangeToPostfix()
error
“);
return
1;
}
return
0;
}
C語言編寫逆波蘭計算器
#includestdio.h
#includestdbool.h
#includestdlib.h
#defineSTACK_SIZE 20
intmake_empty(void);
boolis_empty(void);
boolis_full(void);
voidpush(char );
voidpop(char );
voidstack_overflow(void);
voidstack_underflow(void);
charcontents[STACK_SIZE]= {0},top;
intmain(int argc, char *argv[])
{
char ch=’1′;
while(ch!=’q’){
make_empty();
printf(“Enter an RPNexpression:”);
do{
scanf(” %c”,ch);
if(ch=’1’ch=’9′)
push(ch);
else if(ch==’+’||ch==’-‘||ch==’*’||ch==’/’){
top–;pop(ch);
}
else if(ch==’=’){
if((top-1)==0)
pop(ch);
else
printf(“Nunber notused!”);
break;
}
else if(ch==’\n’);
else{
ch=’q’;break; /*其它情況置為退出標誌q*/
}
}
while(ch!=’\n’);
}
return 0;
}
intmake_empty(void){
/* return top=0;
}
boolis_empty(void){
return top==0;
}
boolis_full(void){
return top==STACK_SIZE;
}
voidpush(char ch){
if(is_full())
stack_overflow();
else
contents[top++]=ch-‘0’;
}
voidpop(char ch){
if(is_empty())
stack_underflow();
else
switch(ch){
case’+’:contents[top-1]+=contents[top];break;
case ‘-‘:contents[top-1]-=contents[top];break;
case’*’:contents[top-1]*=contents[top];break;
case’/’:contents[top-1]/=contents[top];break;
case ‘=’:printf(“Value ofexpression:%d\n”,(int)contents[0]);break;
}
}
voidstack_overflow(void){
printf(“Expression is toocomplex!”);
exit(EXIT_FAILURE);
}
voidstack_underflow(void){
printf(“Not enough operands inexpression!”);
exit(EXIT_FAILURE);
}
C語言 逆波蘭表達式 算法
#include stdio.h
#include string.h
int main()
{
double d[100], *dp = d;
int m, k;
char t[50], *tp = t;
char s[100], *c = s;
char* op = “+-*/”;
char* fg = “0123456789.”;
gets(s);
while(*c) {
if(strchr(op, *c)) {
*tp++ = *c;
k = 0;
}else
if(strchr(fg, *c)) {
sscanf(c, “%lf%n”, dp++, m);
c += m – 1;
++k;
}
++c;
while((dp – d 1 k == 2) || !*c dp – d = 1) {
switch(*–tp) {
case ‘+’: dp[-2] = dp[-2] + dp[-1]; break;
case ‘-‘: dp[-2] = dp[-2] – dp[-1]; break;
case ‘*’: dp[-2] = dp[-2] * dp[-1]; break;
case ‘/’: dp[-2] = dp[-2] / dp[-1]; break;
}
–dp;
}
}
printf(“%f”, *dp);
}
C語言求解逆波蘭表達式
使用棧完成
int add(char s[])
{
int st[100];
char *p;
int top=-1;
int A,B,sum=0;
for(p=s;*p!=0;p++)//進行數值計算
{
switch (*p)
{
case ‘0’:
case ‘1’:
case ‘2’:
case ‘3’:
case ‘4’:
case ‘5’:
case ‘6’:
case ‘7’:
case ‘8’:
case ‘9’:st[++top]=*p-‘0’;break;//是數字壓入總棧st中
case ‘+’:
case ‘-‘:
case ‘*’:
case ‘/’://是運算符號
A=st[top–];
B=st[top–];//彈出2個數字
switch (*p)
{
case ‘+’:sum=B+A;break;
case ‘-‘:sum=B-A;break;
case ‘*’:sum=B*A;break;
case ‘/’: sum=B/A;break;
}
st[++top]=sum;//將結果重新壓入棧
break;
}
}
return sum;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190876.html