125 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #define MAX_SIZE 100
 | |
| 
 | |
| // Structure for Min Heap
 | |
| typedef struct {
 | |
|     int arr[MAX_SIZE];
 | |
|     int size;
 | |
| } MinHeap;
 | |
| 
 | |
| // Structure for Stack
 | |
| typedef struct {
 | |
|     int arr[MAX_SIZE];
 | |
|     int top;
 | |
| } Stack;
 | |
| 
 | |
| // Initialize empty stack
 | |
| void initStack(Stack *s) {
 | |
|     s->top = -1;
 | |
| }
 | |
| 
 | |
| // Check if stack is empty
 | |
| int isEmpty(Stack *s) {
 | |
|     return s->top == -1;
 | |
| }
 | |
| 
 | |
| // Check if stack is full
 | |
| int isFull(Stack *s) {
 | |
|     return s->top == MAX_SIZE - 1;
 | |
| }
 | |
| 
 | |
| // Push element onto stack
 | |
| void push(Stack *s, int value) {
 | |
|     if(isFull(s)) {
 | |
|         printf("Stack Overflow\n");
 | |
|         return;
 | |
|     }
 | |
|     s->arr[++s->top] = value;
 | |
| }
 | |
| 
 | |
| // Pop element from stack
 | |
| int pop(Stack *s) {
 | |
|     if(isEmpty(s)) {
 | |
|         printf("Stack Underflow\n");
 | |
|         return -1;
 | |
|     }
 | |
|     return s->arr[s->top--];
 | |
| }
 | |
| 
 | |
| // Initialize Min Heap
 | |
| void initMinHeap(MinHeap *heap) {
 | |
|     heap->size = 0;
 | |
| }
 | |
| 
 | |
| // Helper function to swap elements
 | |
| void swap(int *a, int *b) {
 | |
|     int temp = *a;
 | |
|     *a = *b;
 | |
|     *b = temp;
 | |
| }
 | |
| 
 | |
| // Heapify function
 | |
| void heapify(MinHeap *heap, int index) {
 | |
|     int smallest = index;
 | |
|     int left = 2 * index + 1;
 | |
|     int right = 2 * index + 2;
 | |
| 
 | |
|     if(left < heap->size && heap->arr[left] < heap->arr[smallest])
 | |
|         smallest = left;
 | |
| 
 | |
|     if(right < heap->size && heap->arr[right] < heap->arr[smallest])
 | |
|         smallest = right;
 | |
| 
 | |
|     if(smallest != index) {
 | |
|         swap(&heap->arr[index], &heap->arr[smallest]);
 | |
|         heapify(heap, smallest);
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Convert stack to min heap
 | |
| void stackToHeap(Stack *s, MinHeap *heap) {
 | |
|     // Copy stack elements to heap array
 | |
|     heap->size = s->top + 1;
 | |
|     for(int i = 0; i <= s->top; i++) {
 | |
|         heap->arr[i] = s->arr[i];
 | |
|     }
 | |
| 
 | |
|     // Heapify all non-leaf nodes
 | |
|     for(int i = (heap->size/2) - 1; i >= 0; i--) {
 | |
|         heapify(heap, i);
 | |
|     }
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|     Stack stack;
 | |
|     MinHeap heap;
 | |
| 
 | |
|     initStack(&stack);
 | |
|     initMinHeap(&heap);
 | |
| 
 | |
|     // Push some elements onto stack
 | |
|     push(&stack, 5);
 | |
|     push(&stack, 3);
 | |
|     push(&stack, 8);
 | |
|     push(&stack, 1);
 | |
|     push(&stack, 2);
 | |
| 
 | |
|     printf("Original Stack: ");
 | |
|     for(int i = 0; i <= stack.top; i++) {
 | |
|         printf("%d ", stack.arr[i]);
 | |
|     }
 | |
|     printf("\n");
 | |
| 
 | |
|     // Convert stack to min heap
 | |
|     stackToHeap(&stack, &heap);
 | |
| 
 | |
|     printf("After Heapifying: ");
 | |
|     for(int i = 0; i < heap.size; i++) {
 | |
|         printf("%d ", heap.arr[i]);
 | |
|     }
 | |
|     printf("\n");
 | |
| 
 | |
|     return 0;
 | |
| }
 | 
