要求:输入以#为结束的算数表达式(包括+,-,*,/)并求值
1.基础的栈结构书写(包括创建栈,判断栈是否为空,以及数据的压栈和出栈)【可参考MOOC上陈越姥姥的相关数据结构课程】
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct SNode* Stack;
struct SNode { //链表结构
char Data;
int Number;
struct SNode* next;
};
Stack CreateStack(Stack S) { //建立新的节点
S = (Stack)malloc(sizeof(struct SNode));
S->next = NULL;
return S;
}
int IsEmpty(Stack S) { //判断栈是否为空
return(S->next==NULL);
}
void Push(char item,Stack S,int i) { //压栈
Stack TmpCell;
TmpCell = (Stack)malloc(sizeof(struct SNode));
TmpCell->Data = item;
TmpCell->Number=i;
TmpCell->next = S->next;
S->next = TmpCell;
}
char Pop(Stack S) { //出栈
Stack FirstCell;
char TopElem;
if(IsEmpty(S)) {
printf("堆栈空");
} else {
FirstCell = S->next;
S->next = FirstCell->next;
TopElem = FirstCell->Data;
free(FirstCell);
return TopElem;
}
}
2.运算符先后顺序的判断
char Compare(char N,char S) { //判断运算符的先后性
if(N=='+'&&S=='+'||N=='-'&&S=='+'||N=='*'&&S=='+'||N=='/'&&S=='+')
return '>';
else if(N=='+'&&S=='-'||N=='-'&&S=='-'||N=='*'&&S=='-'||N=='/'&&S=='-')
return '>';
else if(N=='*'&&S=='*'||N=='*'&&S=='/'||N=='/'&&S=='/'||N=='/'&&S=='*')
return '>';
else if(N=='+'&&S=='*'||N=='-'&&S=='*'||N=='+'&&S=='/'||N=='-'&&S=='/')
return '<';
else if(N=='+'&&S=='#'||N=='-'&&S=='#'||N=='*'&&S=='#'||N=='/'&&S=='#')
return '>';
else if(N=='#'&&S=='+'||N=='#'&&S=='-'||N=='#'&&S=='*'||N=='#'&&S=='/')
return '<';
}
3.运算
int operate(int a,char M,int b) { //进行运算
int s;
switch(M) {
case'+':
s=a+b;
break;
case'-':
s=a-b;
break;
case'*':
s=a*b;
break;
case'/':
s=a/b;
break;
default:
printf("error");
break;
}
return s;
}
4.运算与栈结构相结合
Stack OP(Stack OPTR,Stack OPND) {
char N,M,W;
int a,b,flag=0,i=1,j,A=0,B=0,C,D,E,F[10];
Stack TOP_1,TOP_2;
Push('#',OPTR,1); //将‘#’压入OPTR栈中
scanf("%c",&N); //从键盘中读入字符
TOP_1=OPND->next; //将TOP_1设置为数据栈的栈顶
TOP_2=OPTR->next; //将TOP_2设置为运算符栈的栈顶
while(N!='#') {
if(N>='0'&&N<='9') {
if(flag==0) {
Push(N,OPND,i);
flag=1;
} else {
i++;
Push(N,OPND,i);
}
} else if(N=='+'||N=='-'||N=='*'||N=='/'||N=='#') {
i=1;
flag=0;
W=Compare(TOP_2->Data,N);
switch(W) {
case'<': {
Push(N,OPTR,1);
break;
}
case'>': {
M=Pop(OPTR);
TOP_1=OPND->next;
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
TOP_2=OPTR->next;
if(TOP_2->Data=='#') {
Push(N,OPTR,1);
i=1;
} else { //还有BUG
W=Compare(TOP_2->Data,N);
switch(W) {
case'<': {
Push(N,OPTR,1);
break;
}
case'>': {
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
TOP_2=OPTR->next;
if(TOP_2->Data=='#') {
Push(N,OPTR,1);
i=1;
} else { //还有BUG
W=Compare(TOP_2->Data,N);
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
Push(N,OPTR,1);
}
break;
}
default:
printf("error");
break;
}
i=1;
}
break;
}
default:
printf("error");
break;
}
}
TOP_1=OPND->next;
TOP_2=OPTR->next;
scanf("%c",&N);
}
TOP_1=OPND->next;
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do{
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
TOP_2=OPTR->next;
if(TOP_2->Data=='#') {
return OPND;
} else {
W=Compare(TOP_2->Data,N);
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
return OPND;
}
}
5.主函数
int main() {
int B=0,b,j,i;
Stack OPTR,OPND,TOP_1;
OPTR=CreateStack(OPTR);
OPND=CreateStack(OPND);
OPND=OP(OPTR,OPND);
TOP_1=OPND->next;
i=TOP_1->Number;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
printf("%d",B);
return 0;
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct SNode* Stack;
struct SNode { //链表结构
char Data;
int Number;
struct SNode* next;
};
Stack CreateStack(Stack S) { //建立新的节点
S = (Stack)malloc(sizeof(struct SNode));
S->next = NULL;
return S;
}
int IsEmpty(Stack S) { //判断栈是否为空
return(S->next==NULL);
}
void Push(char item,Stack S,int i) { //压栈
Stack TmpCell;
TmpCell = (Stack)malloc(sizeof(struct SNode));
TmpCell->Data = item;
TmpCell->Number=i;
TmpCell->next = S->next;
S->next = TmpCell;
}
char Pop(Stack S) { //出栈
Stack FirstCell;
char TopElem;
if(IsEmpty(S)) {
printf("堆栈空");
} else {
FirstCell = S->next;
S->next = FirstCell->next;
TopElem = FirstCell->Data;
free(FirstCell);
return TopElem;
}
}
char Compare(char N,char S) { //判断运算符的先后性
if(N=='+'&&S=='+'||N=='-'&&S=='+'||N=='*'&&S=='+'||N=='/'&&S=='+')
return '>';
else if(N=='+'&&S=='-'||N=='-'&&S=='-'||N=='*'&&S=='-'||N=='/'&&S=='-')
return '>';
else if(N=='*'&&S=='*'||N=='*'&&S=='/'||N=='/'&&S=='/'||N=='/'&&S=='*')
return '>';
else if(N=='+'&&S=='*'||N=='-'&&S=='*'||N=='+'&&S=='/'||N=='-'&&S=='/')
return '<';
else if(N=='+'&&S=='#'||N=='-'&&S=='#'||N=='*'&&S=='#'||N=='/'&&S=='#')
return '>';
else if(N=='#'&&S=='+'||N=='#'&&S=='-'||N=='#'&&S=='*'||N=='#'&&S=='/')
return '<';
}
int operate(int a,char M,int b) { //进行运算
int s;
switch(M) {
case'+':
s=a+b;
break;
case'-':
s=a-b;
break;
case'*':
s=a*b;
break;
case'/':
s=a/b;
break;
default:
printf("error");
break;
}
return s;
}
Stack OP(Stack OPTR,Stack OPND) {
char N,M,W;
int a,b,flag=0,i=1,j,A=0,B=0,C,D,E,F[10];
Stack TOP_1,TOP_2;
Push('#',OPTR,1); //将‘#’压入OPTR栈中
scanf("%c",&N); //从键盘中读入字符
TOP_1=OPND->next; //将TOP_1设置为数据栈的栈顶
TOP_2=OPTR->next; //将TOP_2设置为运算符栈的栈顶
while(N!='#') {
if(N>='0'&&N<='9') {
if(flag==0) {
Push(N,OPND,i);
flag=1;
} else {
i++;
Push(N,OPND,i);
}
} else if(N=='+'||N=='-'||N=='*'||N=='/'||N=='#') {
i=1;
flag=0;
W=Compare(TOP_2->Data,N);
switch(W) {
case'<': {
Push(N,OPTR,1);
break;
}
case'>': {
M=Pop(OPTR);
TOP_1=OPND->next;
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
TOP_2=OPTR->next;
if(TOP_2->Data=='#') {
Push(N,OPTR,1);
i=1;
} else { //还有BUG
W=Compare(TOP_2->Data,N);
switch(W) {
case'<': {
Push(N,OPTR,1);
break;
}
case'>': {
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
TOP_2=OPTR->next;
if(TOP_2->Data=='#') {
Push(N,OPTR,1);
i=1;
} else { //还有BUG
W=Compare(TOP_2->Data,N);
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
Push(N,OPTR,1);
}
break;
}
default:
printf("error");
break;
}
i=1;
}
break;
}
default:
printf("error");
break;
}
}
TOP_1=OPND->next;
TOP_2=OPTR->next;
scanf("%c",&N);
}
TOP_1=OPND->next;
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do{
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
TOP_2=OPTR->next;
if(TOP_2->Data=='#') {
return OPND;
} else {
W=Compare(TOP_2->Data,N);
M=Pop(OPTR);
i=TOP_1->Number;
A=0;
a=0;
for(j=0; j<i; j++) {
a=Pop(OPND)-'0';
A=a*pow(10,j)+A;
}
TOP_1=OPND->next;
i=TOP_1->Number;
B=0;
b=0;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
C=operate(B,M,A);
D=C;
E=0;
do {
E++;
F[E]=D%10;
D=D/10;
} while(D!=0);
for(j=E; j>0; j--) {
Push(F[j]+'0',OPND,E);
}
return OPND;
}
}
int main() {
int B=0,b,j,i;
Stack OPTR,OPND,TOP_1;
OPTR=CreateStack(OPTR);
OPND=CreateStack(OPND);
OPND=OP(OPTR,OPND);
TOP_1=OPND->next;
i=TOP_1->Number;
for(j=0; j<i; j++) {
b=Pop(OPND)-'0';
B=b*pow(10,j)+B;
}
printf("%d",B);
return 0;
}
运行结果: