'using queue and stack to reverse odd number only in a queue and other functions
#include <stdio.h>
#include <stdlib.h>
#define type int
#define qsize 40
typedef struct {
int top;
type array[qsize];
}stack;
stack *initstack (){
stack *s=malloc(sizeof(stack)); s->top =0;
return s;
}
void push(stack *s,type x){
s->array[s->top++]=x;
}
type pop(stack *s){
return s->array[--s->top];
}
type isfulls(stack *s){
return s->top>=qsize;
}
type isemptys(stack *s){
return !s->top;
}
type peek(stack *s){
return s->array[s->top-1];
}
//----------------------------------------------------
typedef struct {
type head;
type tail;
int Qnoe;
type elements[qsize];
}queue;
queue *initqueue(){
queue *s=malloc(sizeof(queue));
s->Qnoe=0; s->head=0; s->tail=-1;
return s;
}
void enqueue(queue *s,type e){
s->elements[++s->tail%qsize]=e; s->Qnoe++;
}
type dequeue(queue *s){
type temp=s->elements[s->head++%qsize];
s->Qnoe--; return temp;
}
int isempty(queue *s){
return !s->Qnoe;
}
int isfull(queue *s){
return s->Qnoe==qsize;
}
type gethead(queue *s){
return s->elements[s->head];
}
type gettail(queue *s){
return s->elements[s->tail];
}
void display(queue *s){ ///used just to display the functions
queue *temp=initqueue();
while(!isempty(s)){
type x=dequeue(s);
printf("%d ",x);
enqueue(temp,x);
}
printf("\n\n");
while(!isempty(temp)) enqueue(s,dequeue(temp));
}
int maxvalue(queue *s){
type max,head;
queue *temp=initqueue();if(!isempty(s)) {enqueue(temp,dequeue(s)); max=gethead(s);}
while (!isempty(s)){
head=gethead(s);
if(max<head) max=head;
enqueue(temp,dequeue(s));
}
while(!isempty(temp)) enqueue(s,dequeue(temp));
return max;
}
void swap(queue *s){
type head=gethead(s),tail=gettail(s);int i=0,j=1;
queue *temp=initqueue();
while(!isempty(s)) {i++; enqueue(temp,dequeue(s));}
dequeue(temp); enqueue(s,tail); ;
while(!isempty(temp)){
if(j++==i-1) {enqueue(s,head); break;}
else {enqueue(s,dequeue(temp));}
} free(temp);
}
void insert(queue *s,type e,int index){
queue *temp=initqueue(); int i=1;
while(!isempty(s)){
if(index==i++) {enqueue(temp,e); dequeue(s);}
else enqueue(temp,dequeue(s));
}
while(!isempty(temp)) enqueue(s,dequeue(temp));
}
void revercOdd(queue *s){
queue *tempq=initqueue();
stack *temps=initstack();
while(!isempty(s)){
if(gethead(s)%2){push(temps,dequeue(s)); enqueue(tempq,1);}
else enqueue(tempq,dequeue(s));
}
while(!isempty(tempq)){
if(gethead(tempq)==1){enqueue(s,pop(temps)); dequeue(tempq);}
else enqueue(s,dequeue(tempq));
}
}
int main()
{
queue *s=initqueue();
enqueue(s,5);
enqueue(s,8);
enqueue(s,3);
enqueue(s,2);
enqueue(s,1);
enqueue(s,0);
enqueue(s,112);
printf("the queue: \n");
display(s);
printf("max value in queue : %d\n\n",maxvalue(s));
swap(s);
printf("the queue after swapping the head and tail: \n");
display(s);
printf("\nthe queue: \n");
display(s);
type e,index;
printf("enter he value of the elemnt and the index: ");
scanf("%d%d",&e,&index);
insert(s,e,index);
printf("the queue after inserting %d in the index %d: \n",e,index);
display(s);
printf("\nthe queue: \n");
display(s);
revercOdd(s);
printf("the queue after reversing odd number only: \n");
display(s);
return 0;
}
I made 4 functions 1 to get the max element in the queue 1 to get swap the head and tail of the queue 1 to take an element and index and put it in that index in the queue and 1 to reverse odd numbers only in a queue using queue and stack and a function to display the element of a given queue to check results and in the main, I check the outputs of every function work on its own, but when I use them together the last display shows the garbage element in the queue:
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
