Programming - C Stack-Queue Exercise using Dynamic Arrays by drifter1

View this thread on steempeak.com
· @drifter1 · (edited)
$15.32
Programming - C Stack-Queue Exercise using Dynamic Arrays
<html>
<p><img src="https://tiportal.files.wordpress.com/2013/06/s9.jpg" width="400" height="231"/></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Hello again, in today's post I would like to show you a <strong>Stack-Queue Exercise</strong> that I had to do in my University and it's <strong>Solution</strong>. We had to do almost the same Exercise using <strong>Dynamic Arrays</strong> and<strong> Linked Lists</strong> and I will post them separately. As always, this is my Code and someone else could have done it in another way that could be easier or more difficult then my way. We had only like 2 Weeks for both Exercises and the Exercises were also changed in between, cause some Students had problems with some parts of them. So, without further do. Let's get started!</p>
<p><br></p>
<h1>Task:</h1>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Suppose we have 2 Ferry Boats called S and Q, where S works like a Stack and Q works like a Queue. There will be Cars that choose in which one of those boats they want to go (we will read from a file).&nbsp;</p>
<p>Those 2 Boats will be defined as structs that contain:</p>
<ul>
  <li>the capacity (to check if the Boats are full)</li>
  <li>the sailing number (for writing into files)</li>
  <li>an dynamic car_id array&nbsp;</li>
  <li>top index for Stack or front and rear index for Queue</li>
</ul>
<p>The Cars will be a part of a text file called cars.txt (we will get the name as input) and this file will contain the car_id and the boat preference like this:</p>
<h2>cars.txt:</h2>
<p>ZZA9896 S</p>
<p>MIN5689 Q</p>
<p>NHI9098 S</p>
<p>KNM4545 Q</p>
<p>IPO8987 Q</p>
<p><br></p>
<p>The Programm will:</p>
<ol>
  <li>get the capacity of each boat and the file name as user input</li>
  <li>initialize the boats,</li>
  <li>start reading from the file and then manage the sailings of both boats by filling them until they are full</li>
  <li>when a boat is full we will start a "sailing" by writing the car_id's into a new file with name s0,s1,... if Stack or q0,q1,... if Queue and then reset the boat</li>
  <li>the reading loop will stop when there are no more cars in the file</li>
  <li>then we will check if there are some remainders in the Boats to write them in a "sailing" file aswell</li>
</ol>
<p>The Stack-Queue Functions need to be Functions that are called from the main function!</p>
<p><br></p>
<h1>Solution:</h1>
<pre><code>#include &lt;stdio.h&gt;</code></pre>
<pre><code>#include &lt;stdlib.h&gt;</code></pre>
<pre><code>#include &lt;string.h&gt;</code></pre>
<pre><code><br></code></pre>
<pre><code>// Stack struct</code></pre>
<pre><code>typedef struct Stack{</code></pre>
<pre><code>	int sail_num;</code></pre>
<pre><code>	int capacity;</code></pre>
<pre><code>	int top;</code></pre>
<pre><code>	char **car_id;</code></pre>
<pre><code>}Stack;</code></pre>
<pre><code><br></code></pre>
<pre><code>// Queue struct</code></pre>
<pre><code>typedef struct Queue{</code></pre>
<pre><code>	int sail_num;</code></pre>
<pre><code>	int capacity;</code></pre>
<pre><code>	int front;</code></pre>
<pre><code>	int rear;</code></pre>
<pre><code>	char **car_id;		</code></pre>
<pre><code>}Queue;</code></pre>
<pre><code><br></code></pre>
<pre><code>// Function Declarations</code></pre>
<pre><code>void push(Stack *S, char *x);</code></pre>
<pre><code>void pop(Stack *S, char *car_id);</code></pre>
<pre><code>void StacktoFile(Stack *S);</code></pre>
<pre><code>void add(Queue *Q, char *x);</code></pre>
<pre><code>void delete(Queue *Q, char *car_id);</code></pre>
<pre><code>void QueuetoFile(Queue *Q);</code></pre>
<pre><code><br></code></pre>
<pre><code>int main(){</code></pre>
<pre><code>	// Boat variables</code></pre>
<pre><code>	Stack S;</code></pre>
<pre><code>	Queue Q;</code></pre>
<pre><code>	char input_file[20];</code></pre>
<pre><code>	int i;</code></pre>
<pre><code>	FILE *fp;</code></pre>
<pre><code>	// temp file reading buffers</code></pre>
<pre><code>	char car_id[10];</code></pre>
<pre><code>	char ship;</code></pre>
<pre><code><br></code></pre>
<pre><code>	// read capacity values</code></pre>
<pre><code>	printf("Capacity of S: ");&nbsp;</code></pre>
<pre><code>	scanf("%d", &amp;S.capacity);</code></pre>
<pre><code>	printf("Capacity of Q: ");</code></pre>
<pre><code>	scanf("%d", &amp;Q.capacity);</code></pre>
<pre><code><br></code></pre>
<pre><code>	// read file name</code></pre>
<pre><code>	printf("Input File: ");</code></pre>
<pre><code>	scanf("%19s", input_file);</code></pre>
<pre><code><br></code></pre>
<pre><code>	// open file for reading</code></pre>
<pre><code>	if(!(fp=fopen(input_file, "r"))){&nbsp;</code></pre>
<pre><code>		perror("fopen");</code></pre>
<pre><code>		return 1;</code></pre>
<pre><code>	}&nbsp;</code></pre>
<pre><code><br></code></pre>
<pre><code>	// initialization of Stack</code></pre>
<pre><code>	S.car_id=(char**)malloc(S.capacity*sizeof(char*)); // lines</code></pre>
<pre><code>	for(i=0;i&lt;S.capacity;i++){</code></pre>
<pre><code>		S.car_id[i]=(char*)malloc(10*sizeof(char)); // rows</code></pre>
<pre><code>	}	</code></pre>
<pre><code>	S.top=-1;</code></pre>
<pre><code>	S.sail_num=0;</code></pre>
<pre><code><br></code></pre>
<pre><code>	// initialization of Queue</code></pre>
<pre><code>	Q.car_id=(char**)malloc(Q.capacity*sizeof(char*)); // lines</code></pre>
<pre><code>	for(i=0;i&lt;Q.capacity;i++){</code></pre>
<pre><code>		Q.car_id[i]=(char*)malloc(10*sizeof(char)); // rows</code></pre>
<pre><code>	}</code></pre>
<pre><code>	Q.front=Q.rear=-1;</code></pre>
<pre><code>	Q.sail_num=0;</code></pre>
<pre><code><br></code></pre>
<pre><code>	// loop for reading from file and writing into new ones</code></pre>
<pre><code>	while(fscanf(fp, "%9s %c", car_id, &amp;ship) != EOF){&nbsp;</code></pre>
<pre><code>		// ship S Code</code></pre>
<pre><code>		if(ship=='S'){</code></pre>
<pre><code>			push(&amp;S, car_id);</code></pre>
<pre><code>			// if full write to File</code></pre>
<pre><code>			if(S.top == S.capacity - 1){</code></pre>
<pre><code>				StacktoFile(&amp;S);</code></pre>
<pre><code>			}			</code></pre>
<pre><code>		}</code></pre>
<pre><code>		// ship Q Code</code></pre>
<pre><code>		else{</code></pre>
<pre><code>			add(&amp;Q, car_id);</code></pre>
<pre><code>			// if full write to File</code></pre>
<pre><code>			if(Q.rear == Q.capacity -1){</code></pre>
<pre><code>				QueuetoFile(&amp;Q);</code></pre>
<pre><code>			}</code></pre>
<pre><code>		}</code></pre>
<pre><code>	}</code></pre>
<pre><code><br></code></pre>
<pre><code>	// check if boats are left</code></pre>
<pre><code>	if(S.top!=-1) StacktoFile(&amp;S);</code></pre>
<pre><code>	if(Q.front!=-1) QueuetoFile(&amp;Q);</code></pre>
<pre><code>	fclose(fp);</code></pre>
<pre><code>	return 0;	</code></pre>
<pre><code>}</code></pre>
<pre><code><br></code></pre>
<pre><code>// Stack Functions</code></pre>
<pre><code>void push(Stack *S, char x[]){</code></pre>
<pre><code>	if(S-&gt;top &lt; (S-&gt;capacity - 1)){</code></pre>
<pre><code>		S-&gt;top++;</code></pre>
<pre><code>		strcpy(S-&gt;car_id[S-&gt;top], x);</code></pre>
<pre><code>	}</code></pre>
<pre><code>	// if full write to File</code></pre>
<pre><code>	else{</code></pre>
<pre><code>		StacktoFile(S);</code></pre>
<pre><code>	}</code></pre>
<pre><code>}</code></pre>
<pre><code>void pop(Stack *S, char *car_id){</code></pre>
<pre><code>	if(S-&gt;top==-1){</code></pre>
<pre><code>		printf("Stack is empty!\n");</code></pre>
<pre><code>	}</code></pre>
<pre><code>	else{</code></pre>
<pre><code>		strcpy(car_id, S-&gt;car_id[S-&gt;top]);</code></pre>
<pre><code>		S-&gt;top--;</code></pre>
<pre><code>	}</code></pre>
<pre><code>}</code></pre>
<pre><code>void StacktoFile(Stack *S){</code></pre>
<pre><code>	FILE*fp;</code></pre>
<pre><code>	int i;</code></pre>
<pre><code>	char output_file[10];</code></pre>
<pre><code>	char buffer[2];</code></pre>
<pre><code>	char car_id[10];</code></pre>
<pre><code>	// convert from int to string</code></pre>
<pre><code>	itoa(S-&gt;sail_num, buffer, 10);</code></pre>
<pre><code>	strcpy(output_file, "s");</code></pre>
<pre><code>	strcat(output_file, buffer);</code></pre>
<pre><code>	strcat(output_file, ".txt");</code></pre>
<pre><code>	// write into file</code></pre>
<pre><code>	fp=fopen(output_file, "w");</code></pre>
<pre><code>	while(S-&gt;top&gt;-1){</code></pre>
<pre><code>			pop(S, car_id);</code></pre>
<pre><code>			fprintf(fp, "%s\n", car_id);</code></pre>
<pre><code>	}</code></pre>
<pre><code>	S-&gt;sail_num++;</code></pre>
<pre><code>	fclose(fp);</code></pre>
<pre><code>}</code></pre>
<pre><code><br></code></pre>
<pre><code>// Queue Functions</code></pre>
<pre><code>void add(Queue *Q, char x[]){</code></pre>
<pre><code>	// if full write to File</code></pre>
<pre><code>	if(Q-&gt;rear == Q-&gt;capacity -1){</code></pre>
<pre><code>		QueuetoFile(Q);</code></pre>
<pre><code>		return;</code></pre>
<pre><code>	}</code></pre>
<pre><code>	else if(Q-&gt;front == -1){</code></pre>
<pre><code>		Q-&gt;front=Q-&gt;rear=0;</code></pre>
<pre><code>	}</code></pre>
<pre><code>	else{</code></pre>
<pre><code>		Q-&gt;rear++;</code></pre>
<pre><code>	}</code></pre>
<pre><code>	strcpy(Q-&gt;car_id[Q-&gt;rear], x);</code></pre>
<pre><code>}</code></pre>
<pre><code>void delete(Queue *Q, char *car_id){</code></pre>
<pre><code>	if(Q-&gt;front==-1){</code></pre>
<pre><code>		printf("Queue is Empty!\n");</code></pre>
<pre><code>	}</code></pre>
<pre><code>	else{</code></pre>
<pre><code>		if(Q-&gt;front==Q-&gt;rear){</code></pre>
<pre><code>			strcpy(car_id, Q-&gt;car_id[Q-&gt;front]);</code></pre>
<pre><code>			Q-&gt;front=Q-&gt;rear=-1;</code></pre>
<pre><code>		}</code></pre>
<pre><code>		else{</code></pre>
<pre><code>			strcpy(car_id, Q-&gt;car_id[Q-&gt;front]);</code></pre>
<pre><code>			Q-&gt;front++;</code></pre>
<pre><code>		}</code></pre>
<pre><code>	}</code></pre>
<pre><code>}</code></pre>
<pre><code>void QueuetoFile(Queue *Q){</code></pre>
<pre><code>	FILE*fp;</code></pre>
<pre><code>	int i;</code></pre>
<pre><code>	char output_file[10];</code></pre>
<pre><code>	char buffer[2];</code></pre>
<pre><code>	char car_id[20];</code></pre>
<pre><code>	// convert from int to string</code></pre>
<pre><code>	itoa(Q-&gt;sail_num, buffer, 10);</code></pre>
<pre><code>	strcpy(output_file, "q");</code></pre>
<pre><code>	strcat(output_file, buffer);</code></pre>
<pre><code>	strcat(output_file, ".txt");</code></pre>
<pre><code>	// write into file</code></pre>
<pre><code>	fp=fopen(output_file, "w");</code></pre>
<pre><code>	while(Q-&gt;front!=-1){</code></pre>
<pre><code>		delete(Q, car_id);</code></pre>
<pre><code>		fprintf(fp, "%s\n", car_id);</code></pre>
<pre><code>	}</code></pre>
<pre><code>	Q-&gt;sail_num++;</code></pre>
<pre><code>	fclose(fp);</code></pre>
<pre><code>}</code></pre>
<p><br></p>
<p>That was the end of today's post! Hope you enjoyed it!</p>
<p>Thanks for reading :)</p>
</html>
👍  , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
properties (23)
post_id10,104,508
authordrifter1
permlinkprogramming-c-stack-queue-exercise-using-dynamic-arrays
categoryprogramming
json_metadata"{"app": "steemit/0.1", "format": "html", "image": ["https://tiportal.files.wordpress.com/2013/06/s9.jpg"], "tags": ["programming", "c", "stack", "queue", "exercise"]}"
created2017-08-14 13:04:33
last_update2017-08-14 13:07:21
depth0
children0
net_rshares4,674,523,202,055
last_payout2017-08-21 13:04:33
cashout_time1969-12-31 23:59:59
total_payout_value11.695 SBD
curator_payout_value3.627 SBD
pending_payout_value0.000 SBD
promoted0.000 SBD
body_length10,805
author_reputation59,186,440,518,630
root_title"Programming - C Stack-Queue Exercise using Dynamic Arrays"
beneficiaries[]
max_accepted_payout1,000,000.000 SBD
percent_steem_dollars10,000
author_curate_reward""
vote details (48)