This lab is designed to give you more experience with stacks and dllists.
Input comes from standard input. The following input constructs are recognized:
number Push a number onto the stack. + - / * % The top two values on the stack are: added (+), subtracted (-), multiplied (*), divided (/), or remaindered (%). The two entries are popped off the stack and the result is pushed in their place. In the case of subtraction, division, and remaindering, the topmose value is the rightmost value in the expression. For example, if 3 and 7 are the top two numbers on the stack with 3 being the topmost element, then the subtract command will produce 4 (7-3), the divide command will produce 2 (7/3), and the remainder command will produce 1 (7%3). d Duplicate the top value on the stack. p Print the top value on the stack. The top value remains unchanged. f Print all values on the stack. q Exit the program. c Clear the stack (i.e. pop off all values)Here are some example input sequences:
INPUT: 5 6 + p OUTPUT: 11 INPUT: 3 4 5 - * p 2 - p OUTPUT: -3 -5 INPUT: c p f OUTPUT: main stack: empty main stack: empty INPUT: + OUTPUT: not enough operands INPUT: + 1 2 + p OUTPUT: not enough operands 3 INPUT: c 1 2 3 4 f OUTPUT: main stack: 1 2 3 4 INPUT: c 6 d f * p OUTPUT: main stack: 6 6 36You should use Dr. Plank's stack library to implement your stack. It is fine to use scanf to read each input item.
The first range printed will be the range containing the minimum score and the last range printed will be the range containing the maximum score. For example, if the minimum score is 18 and the maximum score is 35, then the first range printed will be 16-20 and the last range printed will be 32-36.
histolist reads input from stdin. Each line starts with a name (which can be multiple words) and a floating point score. Lines may be blank but a line without a score at the end, or without a name should be flagged as an error. Negative scores should also be flagged as errors.
When your program prints the ranges, it should first print the range and then a list of all names with scores in that range.
Here are some examples:
UNIX> cat PF-Bridge.txt Kevin Wilson - Brad Vander Zanden 44.21 Randall Beatty - Ted McLellan 47.45 Linda Smith - Ron Smith 53.94 Ann Rickard - Michael Oechsler 46.30 Carol Mims - Gloria Kilpatrick 54.86 David Shepler - Mark Harris 42.59 Janet King - Herb Stappenbeck 61.11 Dorothy Jones - Virginia Wooten 49.54 Susan Plank - James Plank 58.10 Brian Hingerty - Vincent Carcello 41.90 UNIX> histolist 5 < PF-Bridge.txt Range: 40 - 45 Kevin Wilson - Brad Vander Zanden David Shepler - Mark Harris Brian Hingerty - Vincent Carcello Range: 45 - 50 Randall Beatty - Ted McLellan Ann Rickard - Michael Oechsler Dorothy Jones - Virginia Wooten Range: 50 - 55 Linda Smith - Ron Smith Carol Mims - Gloria Kilpatrick Range: 55 - 60 Susan Plank - James Plank Range: 60 - 65 Janet King - Herb Stappenbeck UNIX> histolist 3 < PF-Bridge.txt Range: 39 - 42 Brian Hingerty - Vincent Carcello Range: 42 - 45 Kevin Wilson - Brad Vander Zanden David Shepler - Mark Harris Range: 45 - 48 Randall Beatty - Ted McLellan Ann Rickard - Michael Oechsler Range: 48 - 51 Dorothy Jones - Virginia Wooten Range: 51 - 54 Linda Smith - Ron Smith Range: 54 - 57 Carol Mims - Gloria Kilpatrick Range: 57 - 60 Susan Plank - James Plank Range: 60 - 63 Janet King - Herb Stappenbeck UNIX>
Histolist should work in two phases. First, read each person/score into a struct, and put each struct on one big Dllist. While doing this, keep track of the minimum and maximum scores. Obviously, write this and test it.
Next, you need to find out how many ranges you'll have to keep track of. You do this with integer division. Figure it out for yourself. You will want to malloc() an array of this number of Dllist's. Test to make sure you have the right number of ranges.
Next, traverse your main Dllist, and for each person, figure out which range Dllist this person should go on, and append that person to that Dllist. Finally, for each range, traverse the range's Dllist and print out each person's name.