390 likes | 529 Views
This chapter delves into the concepts of stacks and queues in C++, emphasizing the utilization of templates for creating reusable classes and functions. Stacks implement a Last-In-First-Out (LIFO) structure, while queues adhere to a First-In-First-Out (FIFO) pattern. Key operations such as push and pop for stacks and enqueue and dequeue for queues are discussed comprehensively. Additionally, the chapter covers enhancements like priority queues, circular queues, and evaluates expressions using these data structures, illustrating practical applications with code snippets.
E N D
Stacks and Queues Chapter 3
Templates in C++ • Template function in C++ makes it easier to reuse classes and functions. • A template can be viewed as a variable that can be instantiated to any data type, irrespective of whether this data type is a fundamental C++ type or a user-defined type.
Stack • Last-In-First-Out (LIFO) list • Push • Add an element into a stack • Pop • Get and delete an element from a stack push pop
Implementation • private: inttop; T *stack; int capacity; • template<class T> Stack<T>::Stack(intstackCapacity): MaxSize(stackCapacity) { stack=new T[capacity]; top=-1; }
template<classsT> inline Boolean Stack<T>::IsFull() { if (top==capacity-1) return TRUE; else return FALSE; } • template<classs T> inline Boolean Stack<T>::IsEmpty() { if (top==-1) return TRUE; else return FALSE; }
Queue • First-In-First-Out (FIFO) list • Add an element into a queue • Get and delete an element from a queue • Variation • Priority queue
Implementation • private: intfront,rear; T *queue; int capacity; • template<class T> Queue<T>::Queue(intqueueCapacity):capacity(queueCapacity) { queue=new T[capacity]; front=rear= 0; }
template<classsT> inline Boolean Queue<T>::IsFull() { if (rear==capacity-1) return TRUE; else return FALSE; } • template<classs T> inline Boolean Stack<T>::IsEmpty() { if (front==rear) return TRUE; else return FALSE; }
Circular queue • Two indices • front: one position clockwise from the first element • rear: current end
Problem: if front=rear? Increase the capacity of a queue just before it become full
A mazing problem 0: path 1: block
Data type move • struct offsets { inta,b; }; enum directions{ N, NE, E, SE, S, SW, W, NW}; offsets move[8];
Implementation with a stack • A maze is represented by a two dimensional array maze[m][p] • struct Items{ int x, y, dir; };
Evaluation of expressions • X = a / b - c + d * e - a * c • Suppose that a = 4, b = 2, c = 2, d =3, e = 3 • Interpretation 1: • ((4/2)-2)+(3*3)-(4*2)=0 + 8+9=1 • Interpretation 2: • (4/(2-2+3))*(3-4)*2=(4/3)*(-1)*2= -2.66666… • How to generate the machine instructions corresponding to a given expression? • Precedence rule + associative rule
Evaluation of expressions • Infix • Each operator comes in-between the operands • Eg. 2+3 • Postfix • Each operator appears after its operands • Eg. 23+ • Prefix • Each operator appears before its operands • Eg. +23
Evaluating postfix expressions voidEval(Expression e) {// Assume that the last token in e is‘#’ // NextTokenis used to get the next token frome Stack<Token>stack; // initialize stack for (Token x = NextToken(e); x!= ‘#’;x=NextToken(e)) if (xis an operand) stack.Push(x) // add to stack else {// operator remove the correct number of operands for operatorx fromstack; perform the operationxand store the result onto the stack; } }
Infix to postfix • (1) Fully parenthesize expression • a / b - c + d * e - a * c • ((((a / b) - c) + (d * e)) – (a * c)) • (2) All operators replace their corresponding right parentheses. • ((((a / b)- c)+ (d * e)) - a * c)) • (3) Delete all parentheses. • ab/c-de*+ac*-