04-Stacks

advertisement
Stacks
Chapter 3
Ceng-112 Data Structures I
Turgut Kalfaoglu
1
Linear Lists
Operations are;
1. Insertion
2. Deletion
3. Retrieval
4. Traversal (exception for restristed lists).
Ceng-112 Data Structures I
Turgut Kalfaoglu
Figure 3-2
2
Stacks
A stack is a Last in First out (LIFO) data structure in which all
insertions and deletions are restricted to one end called top.
Figure 4-1
Ceng-112 Data Structures I
Turgut Kalfaoglu
3
Stack Basic Operations
Overflow?
Figure 4-2
Ceng-112 Data Structures I
Turgut Kalfaoglu
4
Stack Basic Operations
Underflow?
Figure 4-3
Ceng-112 Data Structures I
Turgut Kalfaoglu
5
Stack Basic Operations
Figure 4-4
Ceng-112 Data Structures I
Turgut Kalfaoglu
6
Figure 4-5
Ceng-112 Data Structures I
Turgut Kalfaoglu
7
Stack Data Structure
Figure 4-6
Ceng-112 Data Structures I
Turgut Kalfaoglu
8
Stack Data Structure
Figure 4-7
Ceng-112 Data Structures I
Turgut Kalfaoglu
9
Stack Operations
Figure 4-8, Part I
Ceng-112 Data Structures I
Turgut Kalfaoglu
10
Stack Operations
Figure 4-8, Part II
Ceng-112 Data Structures I
Turgut Kalfaoglu
11
Create Stack
algorithm createStack
Allocates memory for a stack head node from dynamic memory and returns its
address to the caller.
Pre Nothing
Post Head node allocated or error returned
Return pointer to head node or null pointer if no memory
1.
if (memory available)
1.
2.
3.
2.
allocate (stackPtr)
stackPtrcount = 0
stackPtrtop = null
else
1.
stackPtr = null
3.
return stackPtr
end createStack
Ceng-112 Data Structures I
Turgut Kalfaoglu
12
Push Stack
Figure 4-9
Ceng-112 Data Structures I
Turgut Kalfaoglu
13
algorithm pushStack(val stack <head pointer>,
val data <data type>)
Insert (push) one item into the stack.
Pre stack is a pointer to the stack head structure.
data contains data to be pushed into stack.
Post data have been pushed in stack.
1.
if (stack full)
1.
2.
Push Stack
success = false
else
1.
2.
3.
4.
5.
6.
allocate (newPtr)
newPtrdata= data
newPtrnext= stacktop
stacktop=newPtr
stackcount = stackcount+1
Success=true
3.
return success
end pushStack
Ceng-112 Data Structures I
Turgut Kalfaoglu
14
Pop Stack
Figure 4-10
Ceng-112 Data Structures I
Turgut Kalfaoglu
15
algorithm popStack(val stack <head pointer>,
val dataOut <data type>)
Pops the item on the top of the stack and returns it to the
user.
Pre stack is a pointer to the stack head structure.
dataOut is a reference variable to receive the data.
Post data have been returned to the calling algorithm.
1.
if (stack empty)
1.
2.
Pop Stack
success = false
else
1.
2.
3.
4.
5.
6.
dltPtr= stacktop
dataOut = stacktopdata
stacktop = stacktopnext
stackcount = stackcount – 1
recycle(dltPtr)
success=true
3.
return success
end popStack
Ceng-112 Data Structures I
Turgut Kalfaoglu
16
Destroy Stack
algorithm destroyStack(val stack <head pointer>)
This algorithm releases all nodes back to the dynamic memory.
Pre stack is a pointer to the stack head structure.
Post stack empty and all nodes recycled
1.
if (stack not empty)
1. loop
1.
temp = stacktop
2.
stacktop = stacktoplink
3.
recycled(temp)
2.
recycled (stack)
3.
return null pointer
end destroyStack
Ceng-112 Data Structures I
Turgut Kalfaoglu
17
Stack Applications
We can be classified stack applications into four categories:
1.
Reversing data.
2.
Parsing data.
3.
Postponing data usage.
4.
Backtracking steps.
Ceng-112 Data Structures I
Turgut Kalfaoglu
18
Stack Applications
Reversing Data
1
2
3
4
5
Push
Ceng-112 Data Structures I
5
5
4
3
2
1
Turgut Kalfaoglu
4
3
2
1
Pop
19
Stack Applications
Parsing Data
Breaks the data into independent pieces for further processing.
source program
Compiler
machine language
Figure 4-11
Ceng-112 Data Structures I
Turgut Kalfaoglu
20
Stack Applications
Parsing Data
3.Pop )
2.Push (
1.Push (
3.Pop )
2.Pop )
1.Push (
Ceng-112 Data Structures I
Turgut Kalfaoglu
21
Stack Applications
Posponement
Arithmetic expression can be represent three different formats:
1.
2.
3.
Prefix
Infix
Postfix
+a b
a + b
a b +
Arithmetic precedence;
multiply and divide
before
add and subtract!
Ceng-112 Data Structures I
Turgut Kalfaoglu
22
Stack Applications
Posponement
A+B *C
Place the paranthesis
( A + ( B * C))
Replace it in postfix format
(A(BC*)+)
Remove all paranthesis
ABC*+
Implementation by computer is too hard!
Ceng-112 Data Structures I
Turgut Kalfaoglu
23
Stack Applications
Posponement
* and / operators have higher priority than the operator at the top
of the
stack.
Figure
4-12,
Part I
Ceng-112 Data Structures I
Turgut Kalfaoglu
24
Stack Applications
Posponement
Figure 4-12, Part II
Ceng-112 Data Structures I
Turgut Kalfaoglu
25
Stack Applications
Evaluation of Postfix Expression
Figure 4-13
Ceng-112 Data Structures I
Turgut Kalfaoglu
26
Excercise
• Change the following infix expression to postfix expression
using the algoritmic method (a stack).
a+b*c-d
Solution: abc*+d-
Ceng-112 Data Structures I
Turgut Kalfaoglu
27
•
Infix String : a+b*c-d
•
The first character scanned is 'a'. 'a' is added to the Postfix string. The next character scanned is '+'. It being an
operator, it is pushed to the stack.
•
Next character scanned is 'b' which will be placed in the Postfix string. Next character is '*' which is an operator.
Now, the top element of the stack is '+' which has lower precedence than '*', so '*' will be pushed to the stack.
•
The next character is 'c' which is placed in the Postfix string. Next character scanned is '-'. The topmost character
in the stack is '*' which has a higher precedence than '-'. Thus '*' will be popped out from the stack and added to
the Postfix string. Even now the stack is not empty. Now the topmost element of the stack is '+' which has equal
priority to '-'. So pop the '+' from the stack and add it to the Postfix string. The '-' will be pushed to the stack.
•
Next character is 'd' which is added to Postfix string. Now all characters have been scanned so we must pop the
remaining elements from the stack and add it to the Postfix string. At this stage we have only a '-' in the stack. It is
popped out and added to the Postfix string. So, after all characters are scanned, this is how the stack and Postfix
string will be :
•
End result :
•
* Infix String : a+b*c-d
•
* Postfix String : abc*+d-
Ceng-112 Data Structures I
Turgut Kalfaoglu
28
Stack Applications
BackTracking
Figure 4-14
Ceng-112 Data Structures I
Turgut Kalfaoglu
29
Figure 4-15
Ceng-112 Data Structures I
Turgut Kalfaoglu
30
Stack Applications
BackTracking
Figure 4-16
Ceng-112 Data Structures I
Turgut Kalfaoglu
31
Figure 4-17
Ceng-112 Data Structures I
Turgut Kalfaoglu
32
Array Implementation of Stacks
stack
stackAry <pointer to array of dataType>
count
<integer>
stackMax <integer>
top <index>
end stack
Figure 4-20
Ceng-112 Data Structures I
Turgut Kalfaoglu
33
Hw-5
Write a program that accepts parentheses and brackets characters, one per line
on standard input. Use a stack to determine whether pairs of characters are
matching or not. Therefore complete the body of below function.
bool balanced(const char p[ ], size_t n)
// Precondition: p[0]...p[n-1] contains n characters, each of which
// is '(', ')', '{' or '}'.
// Postcondition: The function returns true if the characters form a
// sequence of correctly balanced parentheses with each '(' matching
// a ')' and each '{' matching a '}'. Note that a sequence such as
// ( { ) } is NOT balanced because when we draw lines to match the
// parentheses to their partners, the lines cross each other. On the
// other hand, ( { } ) amd { ( ) } are both balanced.
Load your HW-5 to FTP site until 13 Apr. 07 at 09:00 am.
Ceng-112 Data Structures I
Turgut Kalfaoglu
34
Exercises
Projects – 23 page 211, 212
Ceng-112 Data Structures I
Figure 4-21
Turgut Kalfaoglu
35
Exercises
Projects – 24 page 212
Ceng-112 Data Structures I
Figure 4-22
Turgut Kalfaoglu
36
Download