Professional Documents
Culture Documents
A.R. Hadaegh Dr. Ahmad R. Hadaegh California State University San Marcos (CSUSM) Page 1
As we mentioned before, two common introductory Abstract Data Type (ADT) that worth studying are Stack and Queue Many problems (or parts of problems) can be thought of as stack problems, queue problems, or other problems that can be solved with the help of another (perhaps user-defined) ADT
You need to decide what ADTs you need, build them, test them, then tackle your larger problem
Page
Stack ADT
A stack is an ADT with specific properties and operations Stack properties are: Only one item can be accessed at a time Always the last item inserted is the first to come out (LIFO)
Stack Operations
Stack operations are: Push: Puts a new item on the top of the stack. Cant push into a full stack Pop: Removes the top item from stack. Cant pop an empty stack Top: Examine top item without modifying stack. Cant top an empty stack Init: Set existing stack to empty Full: Returns true if the stack is full Empty: Returns true if the stack is empty
A.R. Hadaegh Dr. Ahmad R. Hadaegh California State University San Marcos (CSUSM) Page 4
This program assumes bool BracketMaching (string expression) that we have the { following routines char curr, temp; available Stack bracket_stack; for (int i=0; i< stg.size(); i++) bool empty (); { push (item); curr = stg[i]; char top (); if (curr == ( || curr == [ || curr == {) bracket_stack.push (curr); else if (curr == ) || curr == ] || curr == }) if (bracket_stack.empty() ) then return false; else if (bracket_stack.pop() does not match with curr) return false; end if end if } // for loop
return true; }
A.R. Hadaegh Dr. Ahmad R. Hadaegh California State University San Marcos (CSUSM) Page 7
Infix 6-1 (4 + 3) * 2 (2 + 3) / (9 - 4)
Its easy to evaluate postfix and prefix expressions using a stack in part because no brackets are necessary
Page
prefix *+432 evaluate 4 7 + 3 2 * 14 2 Push 2 Push 3 Push 4 Pop 4 Pop 3 Apply + and get 7 Push 7 Pop 7 Pop 2 Apply * and get 14 Push 14
A.R. Hadaegh Dr. Ahmad R. Hadaegh
postfix
43+2*
3 2 * 14 4 + 7 push 4 push 3 Pop 3 Pop 4 Apply addition and get 7 Push 7 Push 2 Pop 2 Pop 7 Apply * and get 14 Push 14
Page 10
Algorithm for evaluating postfix: Parse expression from left to right When an operand is encountered, push it onto the stack
When an operator is encountered, pop the top two operands, apply the operator, and push the result onto the stack
When the expression is completely scanned, the final result will be on the stack What if we want to convert an expression from infix to postfix? For example: 2 + 3 * [(5 - 6) / 2] becomes 2356-2/*+
A.R. Hadaegh Dr. Ahmad R. Hadaegh California State University San Marcos (CSUSM) Page 11
Consider the following example that is scanned from left to right Expression: 2+3*[(56)/2]
Stack
Output:
Output:
+ is an operator and it is placed in the stack. Note there is no operator on the top of the stack with priority >= the + operator
Page 13
Expression: 2+3*[(56)/2]
Stack
Output:
23
Expression: 2+3*[(56)/2]
Stack
Output:
23
* +
A.R. Hadaegh Dr. Ahmad R. Hadaegh
* is an operator and it is placed in the stack without taking anything out of the stack. Note that * has higher priority than +
Page 14
Expression: 2+3*[(56)/2]
Stack
Output:
23
[ * +
Left brackets, no matter what type of bracket it is, it is placed in the stack
Expression: 2+3*[(56)/2]
Stack ( [ * +
Output:
23
Page 15
Expression: 2+3*[(56)/2]
Stack
Output:
235
( [ * +
Expression: 2+3*[(56)/2]
Stack Output: 235 ( Minus sign (-) is placed in the [ stack. Note that the top of the * stack is not an operator to + compare minus sign with it
Page 16
Expression: 2+3*[(56)/2]
Expression: 2+3*[(56)/2]
Stack
Output:
2356-
[ * +
A.R. Hadaegh Dr. Ahmad R. Hadaegh
( is a closing round bracket. Keep on popping from the stack till we you find the matching opening round bracket. DO NOT COPY THE OPEN ROUND BRACKET TO THE OUTPUT
Page 17
Expression: 2+3*[(56)/2]
Stack / [ * +
Output:
2356-
Division (/) is placed in the stack. Note that the top of the stack is not an operator to compare division sign with it
Expression: 2+3*[(56)/2]
Stack / [ * +
Output:
2356-2
Page 18
Expression: 2+3*[(56)/2]
Stack
Output:
2356-2/
* + Stack
] is a closing square bracket. Keep on popping from the stack till we you find the matching opening square bracket. DO NOT COPY THE OPEN SQUARE BRACKET TO THE OUTPUT
Expression: 2+3*[(56)/2]
Output:
23562/*+
We are done. So keep popping from the stack and place the characters to the output line
2 +4 6
9 +8 17
1 5 +7 13
1 +3 4
2 Stack 1 9 5
9 5
+ =6
4 Stack 2 8 7 3 8 7 3
+ =17
7 3
+ =13
+ =4
Result Stack
A.R. Hadaegh Dr. Ahmad R. Hadaegh
7 6
3 7 6
4 3 7 6
Page 22
When a cell is visited, it is marked with . so that the mouse does not try that again.
In general, the mouse always takes right cell first, if it cannot succeed, it takes left and if it still fails, it takes down and finally it tries the upper cell to reach its destination. As long as it finds a space it moves in that path and tries its best to find the exit door. We represent the mouse with M and exit door with E
A.R. Hadaegh Dr. Ahmad R. Hadaegh California State University San Marcos (CSUSM) Page 23
In order to ensure that the mouse does not fall off the maze, we create a wall around the maze.
Thus the mouse will be trapped in the maze until it finds the door.
If the mouse tries all the possible solutions and still cannot find the exit door, we report a failure; otherwise, we report a success.
The algorithm is:
Initialize stack, exitCell, entryCell, currentCell = entryCell; Create a wall of 1s around the maze While currentCell is not exitCell Mark currentCell as visited; Push onto the stack the unvisited neighbors of current Cell in the order of up, down left and right If stack is empty Report failure Else Pop off a cell from the stack and make it currentCell success
A.R. Hadaegh Dr. Ahmad R. Hadaegh California State University San Marcos (CSUSM) Page 24
0 1 2 3 4 5
Start with the following maze where the mouse is at position (3, 3) and the exit door is at (2, 4)
0 1 2 3 4
1 1 1 1 1 1 1 1 1 o o 1 1 o o o E 1 1 o o M 1 1 1 1 1 1 1 1
0 1 2 3 4 5
0 1 2 3 4
1 1 1 1 1 1 1 1 1 o o 1 1 o o o E 1 1 o o M 1 1 1 1 1 1 1 1
Make the current position visited (.) Pop the first element of the stack Move the mouse to that position
(3, 2) (2, 3)
Page 25
0 1 2 3 4 5
0 1 2 3 4
1 1 1 1 1 1 1 1 1 o o 1
Make the current position visited (.) Pop the first element of the stack Move the mouse to that position
1 o o o E 1
1 o M . 1 1 1 1 1 1 1 1
0 1 2 3 4 5
0 1 2 3 4
1 1 1 1 1 1 1 1 1 o o 1 1 o o o E 1 1 M . . 1 1 1 1 1 1 1 1
Page 26
0 1 2 3 4 5
0 1 2 3 4
1 1 1 1 1 1 1 1 1 o o 1
Make the current position visited (.) Pop the first element of the stack Move the mouse to that position
1 M o o E 1
1 . . . 1 1 1 1 1 1 1 1
0 1 2 3 4 5
0 1 2 3 4
1 1 1 1 1 1 1 1 1 o o 1 1 . 1 . M o E 1 . . 1 1
1 1 1 1 1 1
Page 27
0 1 2 3 4 5
0 1 2 3 4
1 1 1 1 1 1 1 1 1 o o 1
Make the current position visited (.) Pop the first element of the stack Move the mouse to that position
1 .
1 .
.
.
M E 1
. 1 1
1 1 1 1 1 1
0 1 2 3 4 5
0 1 2 3 4
1 1 1 1 1 1 1 o 1 . 1 . . . . .
1 o 1 1
1 1 1 1
E/M 1
1 1 1 1
Page 28