Experiment 3 Arithmetic expression evaluation ( Must do , Design experiment )
*
Experimental purpose
Master the basic operation of stack , In depth understanding of stack characteristics , Be able to flexibly use them in the context of practical problems , And deepen the understanding of this structure .
*
Experiment content
Design a program , Demonstrate the process of evaluating arithmetic expressions with operator priority method . Input the correct syntax from the terminal in the form of character sequence , Integer expression without variables . Using textbook tables 3.1 Operator precedence relation given , Realize the evaluation of arithmetic four arithmetic mixed operation expression , And imitate the examples of textbooks 3-1 Demonstrate operator stack in evaluation , Operand stack , Changes in input characters and main operations . Test data can choose examples 3-1 Arithmetic expression of 3*(7-2), Or optional .
*
Data structure definition
( Explain the data structure used in your algorithm , Definition of data type )
Stack is a linear table that can only be inserted or deleted at one end . Insert allowed in table , The end of the delete operation is called the top of the stack . The current position of the top of the stack is dynamic , The current position of the top of the stack is indicated by a position indicator called the top of the stack pointer . When there are no elements in the stack , Empty stack , Stack insertion and deletion operations are usually called stack entry and stack exit . The main feature of stack is last in first out .
Typedef struct{ SElemType *base; SElemType *top; Int stacksize; }SqStack;
stacksize Indicates the current maximum usable capacity of the stack .Base Time stack bottom pointer ,top As a pointer to the top of the stack .
*
Algorithm idea and algorithm design
( Explain the idea of the algorithm in words first , Then give the class C Language algorithm )
To implement operator first algorithm , We use two work stacks ,, One is called OPTR, Used to deposit operators ; The other is called OPND, Used to register operands or operation results , Read each character in sequence , Enter if operand OPND Stack , And if it is an operator OPTR The stack top operator of the stack compares the priority before the operation , Until the entire expression is evaluated .
void GetExpressionValue(){ SqStack OPTR,OPND; SElemType result;// Return the final result
InitStack(&OPTR); InitStack(&OPND); Push(&OPTR,'#');// Place the terminator at the bottom of the operator
printf(" Please enter an arithmetic expression :\n"); char c = getchar();
while(c!='#'||GetTop(&OPTR)!='#'){// When *c=='#'&& Stack top character =='#' When
if(isdigit(c)){// If it is a number, turn it into a number Then enter the operand stack int data[10]; int i,num; i =
num =0;//num Is a middle number Used to convert the number in the string into an integer and then put it on the stack i Used to store the characters in the string data array
while(isdigit(c)){ data[i] = c-'0'; i++; c = getchar(); } for(int
j=0;j<i;j++){ num = num*10+data[j]; } Push(&OPND,num);
}else{// If it is a character, put it on the operator stack SElemType a,b,theta;//a b theta It is used to return the elements in the operand stack and operator stack
switch(Priority(GetTop(&OPTR),c)){// Compare the characters to be put on the stack with the top of the stack Priority relationship of operators case
'<':Push(&OPTR,c); c = getchar(); break; case
'>':Pop(&OPND,&b); Pop(&OPND,&a); Pop(&OPTR,&theta);
Push(&OPND,Reckon(a,theta,b)); break;// Stack results case
'=':Pop(&OPTR,&theta); c = getchar(); break;// Description parentheses meet Delete the brackets in the stack
default:break; } }} Pop(&OPND,&result); printf(" The result is :%d",result); }
*
Experiment code
( Namely C Language program )
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define
STACKINCREMENT 5 #define STACK_INIT_SIZE 10 typedef char SElemType; typedef int
Status; typedef struct{ SElemType *base;// Stack bottom pointer SElemType *top;// Stack top pointer int
stacksize;// Currently allocated storage space }SqStack; char prior[7][7]={
{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','!'},{'>','>','>','>','!','>','>'},
{'<','<','<','<','<','!','='}};// A two-dimensional array that defines the precedence relationship between operators // Construct a storage char Empty stack of type data
Status InitStack(SqStack *s){ s->base = (SElemType
*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!s->base) return ERROR;
s->top = s->base;// The number of elements in the stack is 0 s->stacksize = STACK_INIT_SIZE; return OK; }
// Push Status Push(SqStack *s,SElemType e){ if(s->top-s->base>=s->stacksize){
s->base = (SElemType
*)realloc(s->base,(STACKINCREMENT+s->stacksize)*sizeof(SElemType));
if(!s->base) exit(0); s->top = s->base+s->stacksize; s->stacksize +=
STACKINCREMENT; } *s->top++ = e; return OK; } // Out of stack Status Pop(SqStack
*s,SElemType *e){ if(s->base==s->top){ printf(" Empty stack !\n"); return ERROR; }
*e = *--s->top; return OK; } // Get the top element of the stack SElemType GetTop(SqStack *s){ return
*(s->top-1); } // Determine the subscript in the two-dimensional array if the input character is an operator If it is a number, it is separately distinguished from the operator It is convenient to enter the stack when entering the expression int
Index(char c){ switch(c){ case '+': return 0; case '-': return 1; case
'*': return 2; case '/': return 3; case '(': return 4; case ')': return
5; case '#': return 6; default: return 7; } } // Judge priority , Return size < > = ! char
Priority(char a,char b){ int x,y; x = Index(a); y = Index(b); if(x!=7&&y!=7)
return prior[x][y]; else return '!'; } // Simple expression evaluation int Reckon(int a,char
theta,int b){ switch(theta){ case '+':return a+b; case '-':return a-b;
case '*':return a*b; case '/':return a/b; } } // Judge whether a character is a number Status
isdigit(char ch){ if(ch>='0'&&ch<='9') return OK; return ERROR; } // Arithmetic expression evaluation
void GetExpressionValue(){ SqStack OPTR,OPND; SElemType result;// Return the final result
InitStack(&OPTR); InitStack(&OPND); Push(&OPTR,'#');// Place the terminator at the bottom of the operator
printf(" Please enter an arithmetic expression :\n"); char c = getchar();
while(c!='#'||GetTop(&OPTR)!='#'){// When *c=='#'&& Stack top character =='#' When
if(isdigit(c)){// If it is a number, turn it into a number Then enter the operand stack int data[10]; int i,num; i =
num =0;//num Is a middle number Used to convert the number in the string into an integer and then put it on the stack i Is used to store the characters in the string data array
while(isdigit(c)){ data[i] = c-'0'; i++; c = getchar(); }
for(int j=0;j<i;j++){ num = num*10+data[j]; } Push(&OPND,num);
}else{// If it is a character, put it on the operator stack SElemType a,b,theta;//a b theta It is used to return the elements in the operand stack and operator stack
switch(Priority(GetTop(&OPTR),c)){// Compare the characters to be put on the stack with the top of the stack Priority relationship of operators case
'<':Push(&OPTR,c); c = getchar(); break; case
'>':Pop(&OPND,&b); Pop(&OPND,&a); Pop(&OPTR,&theta);
Push(&OPND,Reckon(a,theta,b)); break;// Stack results case
'=':Pop(&OPTR,&theta); c = getchar(); break;// Description parentheses meet Delete the brackets in the stack
default:break; } } } Pop(&OPND,&result); printf(" The result is :%d",result); }
* Algorithm test results
( Explain test data , Paste the experimental result diagram )
experimental data :3*(5+2) 9/(5+2)
* Analysis and summary
(1) Algorithm complexity analysis and optimization , Defect analysis
( Explain the complexity of your algorithm , What are the advantages and disadvantages of the algorithm )
Data compression storage stack , Its operation mainly includes :
Build stack int Push(SeqStack *S, char x) Push int Pop(SeqStack *S, char x) Out of stack .
The average time complexity of the above operations is O(n), The main time is spent in input operation .
(2) Experimental summary
( Explain how you solve the problems encountered in the experiment , What are the gains )
Through this experiment , Let me review the knowledge of stack , Enhanced my c Language programming ability .
It takes patience to do anything , It takes more patience to design and write programs . At the beginning , I write functions very fast , But when we finally debug, we find that the error is very hidden , It takes a lot of time . Later, I first conceived the functions and parameters of the function on paper , After considering the interface, you can start to compile it , It will be easier to succeed .
Technology