Problem: Write a program, named p p4 4 .c , that behaves in the manner describe in the "usage" message listed below, either printing the usage message when the first command-line argument is "--help", or upon identifying the "-rpn" rpn command-line argument accepting input from stdin . You should write appropriate error messages to stderr if an error arises, whether an unrecognized command-line argument, a stack underflow or overflow, unrecognized input or any other error condition that may arise in your code.

Naming: Your submitted file is to be named p p4.c

Output: Your program's normal output must be to stdout and of one of the formats following, assuming argc and argv are the usual parameters for main() and where < program_name> is argv[0]

If argv[1] is "--help", display the following.

Usage: < program_name>

"< program_name> -- help"

display thi i s usage material.
"< program_name> --rpn"

The program accepts input from standard input as a sequence
of numbers and operators. The numbers (operands, as
integers or floating point numbers) read are pushed on a
stack until needed. When an operator is read, the required
op erands are popped from the stack and used to perform the
calculation, with the result placed on the stack. Valid
operators are +, -, * and /, are interpret ed as addition,
subtraction, multiplication and division, respectively, as
described below. An additional operator is =, which
indicates that the value at the top of the stack is popped
from the stack and displayed along with the number of
values remaining on the stack , whereupon the program
terminates.

Stack underflows generate an error message an d halt the
program, as do a stack overflows. Unrecognized input
tokens produce error messages and result in program
termination, as do unrecognized command line arguments.
The size of the stack is 10.

Stack operations are performed so as to produce results
identically as indicated here.

+ : push(pop() + pop());
- : temp = pop(); push(pop() – – temp;
* : push(pop() * pop());
/ : temp = pop(); push(pop() / temp;
' : push(1.0 / pop());
~ : push(--pop());
** : temp = pop(); push(pow( pop(),temp));
swap : t1 = pop(); t2 = pop(); push(t1); push(t2);
copy : temp = pop(); push(temp); push(temp);
= : pop stack top and display it as the result
with the number of stack elements remaining.

The above describes the majority of the behavior of the program you are to write. To reiterate and expand important points:

  • If the first command-line argument is "--help" subsequent command-line arguments are ignored, the usage message is displayed and the program terminates.
  • If the first command-line argument is "-rpn" subsequent command line arguments are ignored and the program proceeds with reading from standard input.
  • Invalid/unrecognized command-line arguments produce a suitable error message, display the usage information above, and terminate the program.
  • If an unrecognized token is read from standard input, a suitable error message for the type of error is to be displayed with the usage text and the program terminated.
  • If all inputs are recognized and no errors arise, print the following to stdout.
Result = < result popped from top of stack>.
< number of operands on the stack> values remain on the stack.

For all error conditions, print the required output to stderr.

Remember that any item delimited by angle brackets ("< >") is to be replaced with the appropriate information, without the angle brackets.

An additional requirement is that your stack must be implemented using a singly-linked list, a struct for the entries in the linked list and the malloc() function. When the program starts execution, there will be no memory allocated for the stack, only a pointer (initialized NULL) for the stack. A second empty linked list based stack, a "free" list, with required pointer, will be provided to hold unused stack/linked-list nodes that result from popping the stack.

Push operations will involve checking the free list for any previously allocated but free nodes. If available, assign the value of the operand to be pushed to the data portion of the node, remove it from the free node list, and push it onto the stack linked-list. If no free nodes are available, allocate a new node, assign the operand to be pushed to the data member of the node, and push it onto the stack. Pop operations will remove a node from the stack linked list, push it onto the free list, and return the data value of the node to the caller.

Academic Honesty!
It is not our intention to break the school's academic policy. Posted solutions are meant to be used as a reference and should not be submitted as is. We are not held liable for any misuse of the solutions. Please see the frequently asked questions page for further questions and inquiries.
Kindly complete the form. Please provide a valid email address and we will get back to you within 24 hours. Payment is through PayPal, Buy me a Coffee or Cryptocurrency. We are a nonprofit organization however we need funds to keep this organization operating and to be able to complete our research and development projects.