 Zero - set zero of a polynomial

Slides:



Advertisements
Similar presentations
CSCE 3110 Data Structures & Algorithm Analysis
Advertisements

§3 The Stack ADT 1. ADT A stack is a Last-In-First-Out (LIFO) list, that is, an ordered list in which insertions and deletions are.
CSCE 3110 Data Structures & Algorithm Analysis Stacks and Queues Reading: Chap.3 Weiss.
C o n f i d e n t i a l Developed By Nitendra NextHome Subject Name: Data Structure Using C Title : Overview of Stack.
CSCE 3110 Data Structures & Algorithm Analysis Queues Reading: Chap. 3 Weiss.
 Balancing Symbols 3. Applications
Array pair C++ array requires the index set to be a set of consecutive integers starting at 0 C++ does not check an array index to ensure that it belongs.
Data Abstraction and Encapsulation
Chapter 2. C++ Class A class name Data members Member functions Levels of program access –Public: section of a class can be accessed by anyone –Private:
Hash Tables1 Part E Hash Tables  
Chapter 2 Arrays and Structures Instructors: C. Y. Tang and J. S. Roger Jang All the material are integrated from the textbook "Fundamentals of Data Structures.
CS Data Structures Chapter 2 Arrays and Structures.
Data Structure (Part I) Chapter 2 – Arrays Data Abstraction and Encapsulation in C++ Section 1.3 –Data Encapsulation Also called information hiding.
Chapter 4 Stacks Stacks A stack is a linear data structure that can be accessed only at one of its ends for storing and retrieving. Its called.
Data Structures Week 5 Further Data Structures The story so far  We understand the notion of an abstract data type.  Saw some fundamental operations.
DATA STRUCTURE & ALGORITHMS CHAPTER 3: STACKS. 2 Objectives In this chapter, you will: Learn about stacks Examine various stack operations Discover stack.
Matlab Chapter 2: Array and Matrix Operations. What is a vector? In Matlab, it is a single row (horizontal) or column (vertical) of numbers or characters.
CSCE 3110 Data Structures & Algorithm Analysis Arrays and Lists.
CHAPTER 21 ARRAYS AND STRUCTURES. CHAPTER 22 Arrays Array: a set of index and value data structure For each index, there is a value associated with that.
Chapter 2 Arrays and Structures  The array as an abstract data type  Structures and Unions  The polynomial Abstract Data Type  The Sparse Matrix Abstract.
CHAPTER 3 Lists, Stacks, and Queues §1 Abstract Data Type (ADT) 【 Definition 】 Data Type = { Objects }  { Operations } 〖 Example 〗 int = { 0,  1, 
Data Structure (Part II) Chapter 2 – Arrays. Matrix A matrix with 5 rows and 3 columns can be represented by n = 3 m = 5 We say this is a 5×3 matrix.
Data Structure Sang Yong Han Chung-Ang University Spring
Data Structures & Algorithm Analysis Arrays. Array: a set of pairs (index and value) data structure For each index, there is a value associated with that.
CHAPTER 3 STACK CSEB324 DATA STRUCTURES & ALGORITHM.
CHAPTER 21 ARRAYS AND STRUCTURES All the programs in this file are selected from Ellis Horowitz, Sartaj Sahni, and Susan Anderson-Freed “Fundamentals of.
CHP-3 STACKS.
Nyhoff, ADTs, Data Structures and Problem Solving with C++, Second Edition, © 2005 Pearson Education, Inc. All rights reserved More Linking.
STACKS AND QUEUES.
◦ A one-dimensional array in C is declared implicitly by appending brackets to the name of a variable int list[5], *plist[5]; ◦ arrays start at index.
LINKED LISTS.
CHAPTER 21 ARRAYS AND STRUCTURES All the programs in this file are selected from Ellis Horowitz, Sartaj Sahni, and Susan Anderson-Freed “Fundamentals of.
CSCE 3110 Data Structures & Algorithm Analysis
Data Structure Sang Yong Han
Review Use of Stack Introduction Stack in our life Stack Operations
Chapter 4 Stacks
Stacks.
Stacks Stacks.
Analysis of Algorithms
Computer Programming BCT 1113
More Linking Up with Linked Lists
CSCE 3110 Data Structures & Algorithm Analysis
DATA STRUCTURES AND OBJECT ORIENTED PROGRAMMING IN C++
CHAPTER 2 ARRAYS AND STRUCTURES
Data Structures 4th Week
Hassan Khosravi / Geoffrey Tien
Cinda Heeren / Geoffrey Tien
STACKS AND QUEUES UNIT 2 DS THROUGH C++.
Stacks.
STACKS.
Stacks Chapter 4.
Data Structures – Week #3
Algorithms and Data Structures
CSCE 3110 Data Structures & Algorithm Analysis
Stack Data Structure, Reverse Polish Notation, Homework 7
Data Structures Unit-2 Engineered for Tomorrow CSE, MVJCE.
Stacks and Queues The Stack abstract data type
Instructor: Mr.Vahidipour
CSCE 3110 Data Structures & Algorithm Analysis
Stacks Chapter 5 Adapted from Pearson Education, Inc.
5.4 Additional Stack Applications
CSCE 3110 Data Structures & Algorithm Analysis
Linked List (Part I) Data structure.
Further Data Structures
Chapter 2 Determinants Basil Hamed
Cs212: Data Structures Computer Science Department Lecture 6: Stacks.
Stack.
CS210- Lecture 16 July 11, 2005 Agenda Maps and Dictionaries Map ADT
Presented by : Aman Gupta PGT CS KV No.1, Narimedu, Madurai
Presentation transcript:

 Zero - set zero of a polynomial §2.4 Polynomials Objects : P ( x ) = a1 x e1 +  + an x en ; a set of ordered pairs of < ei , ai > where ai is the coefficient and ei is the exponent. ei are nonnegative integers. Operations:  Zero - set zero of a polynomial  IsZero - Judge whether a polynomial is zero  Coef - Finding coefficient of a term in a polynomial.  LeadExp - Finding degree, max { ei }, of a polynomial.  Attach - Attach a term with a polynomial  Remove - Remove a term from a polynomial  SingleMult - Single Multiplication of a polynomial with a term.  Add - Addition of two polynomials.  Mult - Multiplication of two polynomials.

float coef [ MAX_DEGREE ] ; int degree; } Polynomial ; 【Representation 1】 #define MAX_DEGREE 2000 typedef struct { float coef [ MAX_DEGREE ] ; int degree; } Polynomial ; Try to apply Mult on P1(x) = 10x1000+5x14+1 and P2(x) = 3x19902x1492+11x+5 -- now do you see my point? I like it! It’s easy to implement most of the operations, such as Add and Multiplication. Really? What is the time complexity for finding the product of two polynomials of degree N1 and N2? O( N1*N2 ) What’s wrong with that?

【Representation 2】 Given: Declaration: startB startA finishA finishB #define MAX_TERM 100 typedef struct { float coef ; /* assume coefficients are floats*/ int expon; } polynomial; polynomial terms[MAX_TERMS]; /* terms sorted by exponent */ int avail = 0; startB startA finishA finishB avail=6 terms index coef expon 2 1000 1 4 3 10 5 6

 4 COMPARE COMPARE COMPARE COMPARE 〖Example〗 To add A(x) = 5 x4 + 2 x2  4 x + 1 and B(x) = 6 x3 + 3 x2 + 4 x, we first store both of them into terms[ ]: startb =finishb starta =finisha starta starta starta finisha startb startb finishb finisha starta finishb terms index coef expon 5 4 1 2  4 3 6 COMPARE COMPARE COMPARE COMPARE terms index coef expon 7 8 9 10 11 12 13 5 4 6 3 5 2 1 avail=8 avail=9 avail=10 avail=11 startb avail=7 startd =avail finishd =avail1 The resulting polynomial D(x) = A(x) + B(x) is stored in terms[startd] to terms[finishd]. The program Padd can be found on p.64.

the polynomial is NOT sparse? Then this representation takes Analysis of Padd: Let m and n be the number of nonzero terms in A(x) and B(x), respectively, then the time complexity of Padd is: Tpadd(m, n) = O(m + n) Well ... What if the polynomial is NOT sparse? Then this representation takes about twice as much space as the first one! Isn’t that beautiful? It’s a lot more efficient than the first one! Oh in that case ... Nobody’s perfect... A worst case could be: A(x) = x2m +  + x4 + x2 + 1 and B(x) = x2n+1 +  + x3 + x

Note:We can store many polynomials in terms [ ], as long as the total number of nonzero terms is not greater than MAX_TERMS. If avail  MAX_TERMS, then we can either quit, or remove some unnecessary polynomials and create a large, continuous available space at one end of the array. That could mean a lot of data movements which takes time. In addition, we also must change the start and end indices for each polynomial moved.

§2.5 Sparse Matrix Wow! I see how much space What is a SPARSE matrix? I could have wasted. But, but do people really deal with such kind of matrices? What is a SPARSE matrix? What’s wrong with my simple representation A[MAX_ROWS][MAX_COLS]? Well, unlike other math concepts, there is no definite line drawn here. To give you some idea, think of a 1000 by 1000 matrix with 3000 nonzero entries. Unfortunately we do. It’s quite common to see sparse matrices in numerical analysis. So I’d better figure out another way to represent it. Hmm..... A matrix is SPARSE if it contains many zero entries. Many? How many is “many”?

structure SparseMatrix is 1. ADT Definition structure SparseMatrix is objects: A set of triples, <row, column, value>, where row and column are integers and form a unique combination, and value comes from the set item. functions: for all a, b  SparseMatrix, x  item, i, j, maxCol, maxRow  index SparseMatrix Create(maxRow, maxCol) ::= return a SparseMatrix that can hold up to max_items = max_row  max_col and whose maximum row size is max_row and whose maximum column size is max_col. SparseMatrix Transpose(a) ::= return the matrix produced by interchanging the row and column value of every triple. SparseMatrix Add(a, b) ::= if the dimensions of a and b are the same return the matrix produced by adding corresponding items, namely those with identical row and column values. else return error <row, column, value> can uniquely determine an element within a matrix.

structure SparseMatrix is (continued) SparseMatrix Multiply(a, b) ::= if number of columns in a equals number of rows in b return the matrix d produced by multiplying a by b according to the formula: d[i][j] =  (a[i][k]  b[k][j]) where d(i, j) is the (i, j)th element. else return error end SparseMatrix

SparseMatrix Create(maxRow, maxCol) ::= 【Representation 1】 SparseMatrix Create(maxRow, maxCol) ::= #define MAX_TERMS 101 /* maximum number of terms + 1 */ typedef struct { int col ; int row ; int value ; } term ; term a [ MAX_TERMS ] ;

〖Examples〗 p.73 Figure 2.4(b) and p.75 Figure 2.5(a) a[0].row = total number of rows of the matrix; a[0].col = total number of columns of the matrix; a[0].value = total number of nonzero entries in the matrix; a[1] ~ a[MAX_TERMS] store the nonzero elements. 〖Examples〗 p.73 Figure 2.4(b) and p.75 Figure 2.5(a) col 0 col 1 col 2 col 3 col 4 col 5 row 0 row 1 row 2 row 3 row 4 row 5 row col value Note: The indices of rows and columns are in ascending order.

【Representation 2】 Compressed Row Storage (CRS) SparseMatrix Create(maxRow, maxCol, nnz) ::= typedef struct { int n; /* number of columns */ int m; /* number of rows */ int *col_ind; /* The col_ind vector stores the column indexes of the elements in the values vector*/ int *row_ptr; /*The row_ptr vector stores the locations in the val vector that start a row*/ double *values; /* numerical value*/ } SparseMatrix; SprseMatrix a.n = maxRow; sp.m = maxCol; a.col_ind = (int*) malloc(sizeof(int) * nnz; a.row_ptr = (int*) malloc(sizeof(int) * (maxRow + 1); a.values = (double*) malloc(sizeof(double*) * nnz);

〖Examples〗 p.73 Figure 2.4(b) a.n = total number of rows of the matrix; a.m = total number of columns of the matrix; a.row_ptr[maxRow ] = nnz--- total number of nonzero entries in the matrix; 〖Examples〗 p.73 Figure 2.4(b) col 0 col 1 col 2 col 3 col 4 col 5 row 0 row 1 row 2 row 3 row 4 row 5 a 15 3 22 5 -15 1 11 6 2 -6 7 91 28 8 col_ind values row_ptr

B = AT  b [ j ] [ i ] = a [ i ] [ j ] 2. Transposing a Matrix B = AT  b [ j ] [ i ] = a [ i ] [ j ] 【Algorithm 1】 for each row i take element <i, j, value> and store it as element <j, i, value> of the transpose ; row col value row col value 0 0 15 3 0 22  5 0 15 1 1 11

for all elements in column j 【Algorithm 2】 for all elements in column j place element <i, j, value> in element <j, i, value> ; void transpose ( term a[ ], term b[ ] ) /* b = aT */ { int n, i, j, currentb ; n = a[0].value ; /* total number of elements */ b[0].row = a[0].col ; /* rows in b = columns in a */ b[0].col = a[0].row ; /* columns in b = rows in a */ b[0].value = n ; if ( n > 0 ) { /* if it is a nonzero matrix */ currentb = 1 ; /* the current available position in b */ for ( i = 0; i < a[0].col; i++ ) /* transpose by the columns in a */ for (j = 1; j <= n; j++ ) /* from all the elements */ if ( a[j].col == i ) { /* if the element is in the column i */ b[currentb].row = a[j].col ; /* then add it to b */ b[currentb].col = a[j].row ; b[currentb].value = a[j].value ; currentb ++ ; } /* end if */ } /* end if (n>0) */ }

Perhaps I have traded away Analysis of transpose: The time complexity of transpose is O ( columns  elements ) Note: The simple algorithm for ( j = 0; j < columns; j++ ) for ( i = 0; i < rows; i++ ) b [ j ] [ i ] = a [ i ] [ j ] ; requires O (columns  rows ). If the matrix is not so sparse, that is, if elements = O (columns  rows ), then our transpose function takes O (columns2  rows ). Oops! Perhaps I have traded away too much time for space ...

【Algorithm 3】 Fast-Transpose =1 sp =3 sp =4 sp =6 sp =8 sp =8 =2 =4 =5 =7 =9 col 0 col 1 col 2 col 3 col 4 col 5 row 0 row 1 row 2 row 3 row 4 row 5 rt =2 rt =1 rt =2 rt =2 rt =0 rt =1 row col value row col value  b [ sp[0] ] ; sp[0]++ ; 0 0 15  b [ sp[3] ] ; sp[3]++ ; 0 4 91  b [ sp[5] ] ; sp[5]++ ; 1 1 11  b [ sp[1] ] ; sp[1]++ ; 2 1 3  b [ sp[2] ] ; sp[2]++ ; 2 5 28  b [ sp[3] ] ; sp[3]++ ; 3 0 22  b [ sp[0] ] ; sp[0]++ ; 3 2 6  b [ sp[2] ] ; sp[2]++ ; 5 0 15

#define MAX_COL 50 /* maximum number of columns + 1 */ void fast_transpose ( term a[ ], term b[ ] ) /* b = aT */ { int row_terms[MAX_COL], starting_pos[MAX_COL] ; int i, j, num_cols = a[0].col, num_terms = a[0].value ; b[0].row = num_cols ; b[0].col = a[0].row ; b[0].value = num_terms ; if ( num_terms > 0 ) { /* if it is a nonzero matrix */ for ( i = 0; i < num_cols; i++ ) row_terms[i] = 0 ; /* initialize rt */ for ( i = 1; i < num_terms; i++ ) row_terms[ a[i].col ] ++ ; /* count # of terms in each column */ starting_pos[0] = 1; /* position of the 1st term of col 0 in b */ for ( i = 1; i < num_cols; i++ ) starting_pos[i] = starting_pos[i1] + row_terms[i1] ; /* position of the 1st term of col i in b */ for ( i = 1; i < num_terms; i++ ) { j = starting_pos[ a[i].col ] ++ ; /* j is the index of a[i] in b */ /* and sp++ now points to the next term in this column */ b[j].row = a[i].col ; b[j].col = a[i].row ; b[j].value = a[i].value ; } /* end for-loop */ } /* end if */ } Time complexity = O( ? ) columns + elements

3. Matrix Multiplication 【Definition】Given A and B where A is m  n and B is n  p, the product matrix D has dimension m  p. Its <i, j> element is: for 0  i < m and 0  j < p. Note: The product of two sparse matrices may no longer be sparse. For example:

Sketch of the idea: D = A  B  Compute D by rows so that we can store them in their proper order without moving elements.  Fix any 0  row of A  rows_a, find all elements in column of B = 0, 1, , cols_b  1.  To avoid scanning all elements of B to arrange a column, we compute BT first and store it into new_b.  Multiply row of A with column of B, using an algorithm similar to the symbolic polynomial addition.

Program: void mmult ( term a[ ], term b[ ], term d[ ] ) { /* d = a  b */ int i, j, column, totalB = b[0].value, totalD = 0; int rowsA = a[0].row, colsA = a[0].col, totalA = a[0].value; int colsB = b[0].col, rowBegin = 1, row=a[1].row, sum = 0; term newB[MAX_TERMS]; if ( colsA!= b[0].row ) { fprintf( stderr, “Incompatible matrices\n” ); exit( 1 ); /* if it’s an illegal call, then you’ll be kicked out */ } /* end if */ fast_transpose( b, newB ); /* new_b = bT */ a[ totalA + 1 ].row = rowsA ; /* set the boundary */ newB[ totalB + 1 ].row = colsB; /* conditions for the */ newB[ totalB + 1 ].col = 0; /* following loops */ There’s a misprint on p.81

storesum can be found on p.82 for ( i = 1; i <= totalA; ) { column = newB[1].row ; /* start from the 1st column of b */ for ( j = 1; j <= totalB + 1; ) { /* begin multiplying row of a by column of b */ if ( a[i].row != row ) { /* if the i-th row of a has no more nonzero terms */ storesum( d, &totalD, row, column, &sum ); /* then store the result in d */ i = rowBegin; /* set i back to the beginning of this row */ for ( ; newB[j].row == column; j++ ) ; /* if there are more terms left in the column of b */ /* then they must be multiplied to zeros in a */ /* so we may simple ignore them */ column = newB[j].row; /* column now points to the next column in b */ } /* end if TRUE */ storesum can be found on p.82

else if ( newB[j].row != column ) { /* if this column of b has no more nonzero terms */ storesum(d, &totalD, row, column, &sum); i = rowBegin; column = newB[j].row; } /* end else if TRUE */ else switch (COMPARE( a[i].col, newB[j].col )) { /* if in the middle of multiplication */ case -1: i++; break; /* goto next term in a */ case 0: sum += (a[i++].value * newB[j++].value); break; /*add terms, goto next term in a & b */ case 1: j++; /* advance to next term in b */ } /* end switch */ } /* end for -loop of j <= totalb + 1 */ for ( ; a[i].row == row; i++ ) /* if b has no more nonzero */ ; /* columns, yet a has some left in this row, ignore them */ rowBegin = i; row = a[i].row; /* next row */ } /* end for-loop of i <= totala */ d[0].row = rowsA; d[0].col = colsB; d[0].value = totalD; }

Analysis of mmult Space = simple variables + a + b + d + new_b (including additional space required by fast_transpose) Time :  For fast_transpose —— O( cols_b + totalb )  For each single dij in the ith row —— O( terms_row_a )  For the ith row of d —— O( terms_row_a  cols_b + cols_b + totalb ) Reset i j-loop Total time complexity

Compare to the simple algorithm: for ( i = 0; i < rows_a; i++ ) for ( j = 0; j < cols_b; j++ ) { sum = 0; for ( k = 0; k < cols_a; k++ ) sum += a[i][k] * b[k][j] ; d[i][j] = sum ; } Tp = O( rows_a  cols_b  cols_a ) Yeah I know I know, then allocating space from the array will be difficult. But there’s little I can do with Array ... Similar to the short-coming of the presentation of polynomials: since the matrices are of different sizes, I would like to put them all in one array. Then ... Now, are you satisfied? What do you mean by “almost”?! The worst case of mmult : totala  cols_a  rows_a or totalb  cols_b  rows_b Then Tmmult  Tp . Almost ...

Note: sizeof( element ) §2.6 Multidimensional Array —— computing the address If an array is declared a[upper0][upper1]  [uppern1], then the total number of elements in the array is One way to represent multidimensional arrays is row major order. 〖Example〗 2-D array: a[upper0][upper1] Note: sizeof( element ) is omitted here.  row 0 upper1 row 1    row upper01 a Content: a[0][0] a[0][1]  a[i][0]   a[i][j] Address:  +1  +iupper1  +iupper1+j

How many multiplications must the compiler do to compute 〖Example〗 3-D array: a[upper0][upper1][upper2]  row 0 upper1upper2    a row upper01 How many multiplications must the compiler do to compute the address using this formula? Content: a[0][0][0]  a[i][0][0]   a[i][j][k] Address:   +iupper1upper2  + iupper1upper2 +jupper2+k In general, for any given n-D array a[upper0][upper1]  [uppern1], if the address of a[0][0] is , then the address of a[i0][i1]  [in1] must be  + i0upper1upper2uppern1 +i1upper2uppern1 +   +in2uppern1 +in1

According to the formula, the number of multiplications is Addition and subtraction are much faster than multiplication and division. That’s why we only care about # of multiplications here. Other options:  Notice that aj = upperj+1  aj+1, therefore we can compute aj using (n 2) multiplications. With (n 1) additional multiplications in the formula, we can get the address using (2n 3) multiplications.  Using the law of association, we can reduce the amount of computations even further: There are (n 1) multiplications only.

§2.7 Strings 1. Introduction structure String is objects: A finite set of zero or more characters. functions: for all s, t  String, i, j, m  non-negative integers String Null(m) ::= return a string whose maximum length is m characters, but is initially set to NULL. We write NULL as “”. Integer Compare(s, t) ::= if (s equals t) return 0 else if (s precedes t) return 1 else return +1 Boolean IsNull(s) ::= if (Compare(s, NULL)) return FALSE else return TRUE Integer Length(s) ::= if (Compare(s, NULL)) return the number of characters in s else return 0

HW: Review the representation of strings in C, §6 The String ADT structure String is (continued) String Concat(s, t) ::= if (Compare(t, NULL)) return a string whose elements are those of s followed by those of t. It is called concatenation. else return s String Substr(s, i, j) ::= if ( (j > 0) && (i+j1) < Length(s) ) return the string containing the characters of s at positions i, i+1, , i+j1 else return NULL end String HW: Review the representation of strings in C, and the functions provided by < string.h > (shown on p.89).

Chapter 3 STACKS AND QUEUES

3.1 The Stack Abstract Data Type An ordered list in which insertions and deletions are made at one end called the top only. Last - In - First - Out ( L I F O ) Stack S = (a0, …, an-1) a0 -- the bottom element an-1 -- the top element 6 5 6 5 4 3 5 2 6 1

Example: System stack after function call fp main a1 return address local variables old frame ptr.

Stack Abstract Data Type Structure Stack is Object: a finite ordered list with zero or more elements. Functions: for all stack ∈ Stack, item ∈ element, max_stack_size ∈ positive integer Stack CreateS(max_stack_size) ::= create an empty stack whose maximum size is max_stack_size Boolean IsFull(stack, max_stack_size) ::= if ( number of elements in stack == max_stack_size ) return TRUE else return FALSE Stack Push(stack, item) ::= if ( IsFull(stack) ) stack_full else insert item into top of stack and return Boolean IsEmpty(stack) ::= if ( stack == CreateS(max_stack_size) ) return TRUE Element Pop(stack) ::= if ( IsEmpty(stack) ) return else remove and return the item on the top of the stack

Representation and Operations Stack CreateS ( max_stack_size ) ::= #define MAX_STACK_SIZE 100 /*maximum stack size */ typedef struct { int key; /* other fields */ } element; element stack [ MAX_STACK_SIZE ]; int top = -1; Operations Boolean IsEmpty(stack) ::= top < 0; Boolean IsFull(stack) ::= top >= max_stack_size - 1; Push to a stack Pop from a stack

【example】 Add to a stack and Delete from a stack int Push(int *top, element item) { /* add an item to the global stack */ if ( *top >= MAX_STACK_SIZE -1 ) { stack_Full(); return FALSE; } stack[++*top] = item; return TRUE; int Pop(int *top, element *pX) { /* return the top element from the stack */ if ( *top == -1 ) return FALSE; /* return an error key */ *pX = stack[(*top)--]; return TRUE; }

栈的应用举例  例1 数制转换    算法基于原理:  N=(N div d) *d +N mod d

 例如:(1348)10=(2504)8    其运算过程如下: N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2

void conversion( ) { scanf(“%d”,&n); while (n) { Push(&top,n%2); n=n/2; } while (!isEmpty(stack)){ if (Pop(&top,&e)) printf(“%d”,e); }//conversion

2 4 8 3 2 3 8 6 例2 (后缀表达式求值) Postfix Evaluation 〖Example〗An infix expression: a  b  c  d  e A prefix expression:   a  b c  d e A postfix expression: a b c   d e   operator with the highest precedence Reverse Polish notation operator operand 〖Example〗 6 2  3  4 2   = ? 8 Get token: 6 ( operand ) Get token: 2 ( operand ) Get token:  ( operator ) Get token: 3 ( operand ) 2 top Get token:  ( operator ) Get token: 4 ( operand ) 4 8 3 2 top top top top top Get token: 2 ( operand ) Get token:  ( operator ) 6  2 = 3 3 8 6 top top top top top top top top Get token:  ( operator ) 3 3 Pop: 8  = 0 top top top top top 4  2 = 8  = 8 8 T( N ) = O ( N ). No need to know precedence rules. Read Program 3.13-3.14 (P133,134) for Postfix evaluation.