Showing posts with label data structure. Show all posts
Showing posts with label data structure. Show all posts

Monday, January 10, 2011

power using recursion / recursive function

/*****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for finding power using recursion
*/


#include<stdio.h>

int
fun(int a,int b)
{


if
(b>1)
{

return
a*fun(a,b-1);
}


else

{

return
a;
}
}


void
main()
{


int
a =3 ;
int
b = 2;

printf("\nEnter a: ");
scanf("%d",&a);
printf("Enter b: ");

scanf("%d",&b);
printf("%d^%d is: %d\n",a,b,fun(a,b));
}

factorial using recursion

/*****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for finding factorial using recursion
*/


#include<stdio.h>

int
fun(int n)
{


if
(n>1)
{

return
n*fun(n-1);
}


else

{

return
1;
}
}


void
main()
{


int
n =3 ;
printf("\nEnter a number to find factorial: ");
scanf("%d",&n);

printf("Factorial is: %d\n",fun(n));
}

infix to prefix with bracket

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for infix to prefix with bracket
*/


#include<stdio.h>
#include<string.h>

#define MAX 100

/*
* this will not catch errors
* eg if you enter (a*b]+c then it will output
*/


/* OP:
* Enter expression: (a*(c+d)+(e+f)*g)/(j+i)
* prefix of entered (infix) expression is:
* /+*a+cd*+efg+ji
*
*/




// personally, i believe that declaring TOP and S here is bad practice

void
main()
{

int
TOP = -1, PTOP = 0;

char
s[MAX];
char
pref[MAX] = {'\0'};

int
pre(char);
int
push(char[], int, char);

int
pop(char *, int *);

char
c[MAX] = {'\0'}, symb, x;

int
i, j;
char
temp;
printf("Enter expression: ");

gets(c);

/*
* gets will give error when compiling on modern compiler
*/


/*
* here i don't have strrev function on my compiler (gcc) so i am doing this manually
* but you can write strrev(c); if your compiler supports it
*/

i = 0;

j = strlen(c) - 1;
while
(i < j)
{


temp = c[i];
c[i++] = c[j];

c[j--] = temp;
}


// x = pop(s,&TOP);
// TOP = push(s,TOP,symb);

for
(i = 0; c[i] != '\0'; i++)
{


symb = c[i];
if
(isalpha(symb) > 0)
{


pref[PTOP] = symb;
PTOP++;
}

else if
(symb == '+' || symb == '-' || symb == '*' || symb == '/' || symb == '\\' || symb == '^' || symb == '$')
{


while
((pre(symb)) < (pre(s[TOP])))
{


x = pop(s, &TOP);
pref[PTOP] = x;

PTOP++;
}

TOP = push(s, TOP, symb);
}


else if
(symb == '}' || symb == ']' || symb == ')')
{


TOP = push(s, TOP, symb);
}

else


{

x = '\0';
while
(x != '}' && x != ']' && x != ')')
{


x = pop(s, &TOP);
if
(x != '}' && x != ']' && x != ')')
{


pref[PTOP] = x;
PTOP++;
}
}
}
}

while
(TOP >= 0)
{


x = pop(s, &TOP);
pref[PTOP] = x;

PTOP++;
}

pref[PTOP] = '\0';




i = 0;
j = strlen(pref) - 1;


while
(i < j)
{

temp = pref[i];

pref[i++] = pref[j];
pref[j--] = temp;
}




printf("\nprefix of entered (infix) expression is:\n%s\n", pref);


// getch(); // win not work on linux
}

int
push(char *s, int top, char ele)
{


int
i;
if
(top >= MAX)
{


printf("\nStack Overflow");
}

else

{

s[++top] = ele;
}


return
top;
}


int
pop(char *a, int *top)
{


if
((*top) >= 0)
{
(*
top) = (*top) - 1;

return
a[(*top) + 1];
}

else

{


printf("Stack underflow\n");
return
0;
}
}


int
pre(char x)
{


int
a;
switch
(x)
{

case
'(':

case
'{':
case
'[':
a = -5;

break
;
case
'+':
case
'-':
a = 2;

break
;
case
'/':
case
'*':
case
'\\':

case
'%':
a = 5;
break
;

case
'$':
case
'^':
a = 10;

break
;
}

return
a;
}

infix to postfix with bracket

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for infix to postfix with bracket
*/


#include<stdio.h>
#define MAX 100


/*
* this will not catch errors
* eg if you enter (a*b]+c then it will output ab*c+
*/

/* OP:
* Enter expression: (a*(c+d)+(e+f)*g)/(j+i)
* postfix of entered (infix) expression is:
* acd+*ef+g*+ji+/
*/



// personally, i believe that declaring TOP and S here is bad practice

void
main()
{

int
TOP = -1, PTOP = 0;

char
s[MAX];
char
post[MAX] = {'\0'};

int
pre(char);
int
push(char[], int, char);

int
pop(char *, int *);

char
c[MAX] = {'\0'}, symb, x;

int
i;
printf("Enter expression: ");
gets(c);

/*
* gets will give error when compiling on modern compiler
*/


// x = pop(s,&TOP);
// TOP = push(s,TOP,symb);

for
(i = 0; c[i] != '\0'; i++)
{


symb = c[i];
if
(isalpha(symb) > 0)
{


post[PTOP] = symb;
PTOP++;
}

else if
(symb == '+' || symb == '-' || symb == '*' || symb == '/' || symb == '\\' || symb == '^' || symb == '$')
{


while
((pre(symb)) <= (pre(s[TOP])) && TOP >= 0)
{


x = pop(s, &TOP);
post[PTOP] = x;

PTOP++;
}

TOP = push(s, TOP, symb);
}


else if
(symb == '(' || symb == '[' || symb == '{')
{


TOP = push(s, TOP, symb);
}

else


{

x = '\0';
while
(x != '(' && x != '{' && x != '[')
{


x = pop(s, &TOP);
if
(x != '(' && x != '{' && x != '[')
{


post[PTOP] = x;
PTOP++;
}
}
}
}

while
(TOP >= 0)
{


x = pop(s, &TOP);
post[PTOP] = x;

PTOP++;
}

post[PTOP] = '\0';
printf("\npostfix of entered (infix) expression is:\n%s\n", post);


// getch(); // win not work on linux
}

int
push(char *s, int top, char ele)
{


int
i;
if
(top >= MAX)
{


printf("\nStack Overflow");
}

else

{

s[++top] = ele;
}


return
top;
}


int
pop(char *a, int *top)
{


if
((*top) >= 0)
{
(*
top) = (*top) - 1;

return
a[(*top) + 1];
}

else

{


printf("Stack underflow\n");
return
0;
}
}


int
pre(char x)
{


int
a;
switch
(x)
{

case
'(':

case
'{':
case
'[':
a = -5;

break
;
case
'+':
case
'-':
a = 2;

break
;
case
'/':
case
'*':
case
'\\':

case
'%':
a = 5;
break
;

case
'$':
case
'^':
a = 10;

break
;
}

return
a;
}

infix to postfix without bracket

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for infix to postfix without bracket
*/


#include<stdio.h>
#define MAX 100


void
main()
{

int
TOP = -1, PTOP = 0;

char
s[MAX];
char
post[MAX] = {'\0'};

int
pre(char);
int
push(char[], int, char);

int
pop(char *, int *);

char
c[MAX] = {'\0'}, symb, x;

int
i;
printf("Enter expression: ");
gets(c);

/*
* gets will give error when compiling on modern compiler
*/


for
(i = 0; c[i] != '\0'; i++) // NULL will give error on iso compiler

{
symb = c[i];
if
(isalpha(symb) > 0)
{


post[PTOP] = symb;
PTOP++;
}

else

{


while
((pre(symb)) <= (pre(s[TOP])) && TOP >= 0)
{


x = pop(s, &TOP);
post[PTOP] = x;

PTOP++;
}

TOP = push(s, TOP, symb);
}
}


while
(TOP >= 0)
{

x = pop(s, &TOP);

post[PTOP] = x;
PTOP++;
}

post[PTOP] = '\0';

printf("\nPostfix of entered (infix) expression is:\n %s\n", post);
// getch(); // win not work on linux
}

int
push(char *s, int top, char ele)
{


int
i;
if
(top >= MAX)
{


printf("\nStack Overflow");
}

else

{

s[++top] = ele;
}


return
top;
}


int
pop(char *a, int *top)
{


if
((*top) >= 0)
{
(*
top) = (*top) - 1;

return
a[(*top) + 1];
}

else

{


printf("Stack underflow\n");
return
0;
}
}


int
pre(char x)
{


int
a;
switch
(x)
{

case
'+':

case
'-':
a = 2;
break
;

case
'/':
case
'*':
case
'\\':

case
'%':
a = 5;
break
;

case
'$':
case
'^':
a = 10;

break
;
}

return
a;
}

infix to postfix without bracket

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for infix to postfix without bracket
*/


#include<stdio.h>
#define MAX 100


void
main()
{

int
TOP = -1, PTOP = 0;

char
s[MAX];
char
post[MAX] = {'\0'};

int
pre(char);
int
push(char[], int, char);

int
pop(char *, int *);

char
c[MAX] = {'\0'}, symb, x;

int
i;
printf("Enter expression: ");
gets(c);

/*
* gets will give error when compiling on modern compiler
*/


for
(i = 0; c[i] != '\0'; i++) // NULL will give error on iso compiler

{
symb = c[i];
if
(isalpha(symb) > 0)
{


post[PTOP] = symb;
PTOP++;
}

else

{


while
((pre(symb)) <= (pre(s[TOP])) && TOP >= 0)
{


x = pop(s, &TOP);
post[PTOP] = x;

PTOP++;
}

TOP = push(s, TOP, symb);
}
}


while
(TOP >= 0)
{

x = pop(s, &TOP);

post[PTOP] = x;
PTOP++;
}

post[PTOP] = '\0';

printf("\nPostfix of entered (infix) expression is:\n %s\n", post);
// getch(); // win not work on linux
}

int
push(char *s, int top, char ele)
{


int
i;
if
(top >= MAX)
{


printf("\nStack Overflow");
}

else

{

s[++top] = ele;
}


return
top;
}


int
pop(char *a, int *top)
{


if
((*top) >= 0)
{
(*
top) = (*top) - 1;

return
a[(*top) + 1];
}

else

{


printf("Stack underflow\n");
return
0;
}
}


int
pre(char x)
{


int
a;
switch
(x)
{

case
'+':

case
'-':
a = 2;
break
;

case
'/':
case
'*':
case
'\\':

case
'%':
a = 5;
break
;

case
'$':
case
'^':
a = 10;

break
;
}

return
a;
}

Wednesday, December 29, 2010

decimal to binary and binary to 1's and 2's complement




/*****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for decinal to binanry and 1's and 2's complement
*/


#include<stdio.h>
#include <string.h>


void
main()
{


struct
binary
{

int
f : 2; // we use bit field here because it occupies less space

} b[100], c[100], d[100];

/**
* b[] will store binary, c[] will store 1's complement
* d[] will store 2's complement
*/
/* a will store decomal*/

long int
a;
long int
n, i, j; // n is the length of binary. i and j are for loops.

// now scanning pisitive number

do
{

printf("\nEnter a valid positive integer number: ");
scanf("%ld", &a);
}


while
(a < 0);
for
(i = 0; a != 0; i++)
{


b[i].f = a % 2;
a = a / 2;
}


n = i - 1;
printf("\nBinary of entered number is: ");

for
(i = n; i >= 0; i--)
{


printf("%d", b[i].f);
}

/**
* 2's complement of binary nyumber
* binary : 1 0 1 0 1 1 0
* 2's complement: 0 1 0 1 0 1 0
* while going right to left put 0 as it is untill you get 1. put 1 as it is
* and then change 1 to 0 and 0 to 1.
*/

for
(i = 0; i <= n; i++)
{


if
(b[i].f == 1)
{

d[i].f = 1;

i++;
for
(j = i; j <= n; j++)
{


if
(b[j].f == 1)
{

d[j].f = 0;
}


else

{

d[j].f = 1;
}
}


break
;
}

else

{

d[i].f = 0;
}
}


printf("\n\n2's complement of number is: ");
for
(i = n; i >= 0; i--)
{


printf("%d", d[i].f);
}


/**
* getting and printing 1's complement
* binary : 1 0 1 0 1 1 0
* 1's complement : 0 1 0 1 0 0 1
* this one is having simple logic. change all 0 to 1 and all
* 1 to 0.
*/


printf("\n\n1's complement of number is: ");
for
(i = n; i >= 0; i--)
{


if
(b[i].f == 0)
{

c[i].f = 1;

// if it is 0 then change to 1
}
else

{

c[i].f = 0;
}


printf("%d", c[i].f);
}

printf("\n");
}


general palindrome check using stack

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for general palindrome string
*/


#include<stdio.h>
#include<string.h>

#define MAX 100
#define TRUE 1
#define FALSE 0

int
push(char *s, int top, char ele)
{


int
i;
if
(top >= MAX)
{


printf("\nStack Overflow");
}

else

{

s[++top] = ele;
}


return
top;
}


int
pop(char *a, int *top)
{


if
((*top) >= 0)
{
(*
top) = (*top) - 1;

return
a[(*top) + 1];
}

else

{


printf("Stack underflow\n");
return
0;
}
}


void
main()
{


int
i;
char
a, b;
char
c[MAX];

int
valid = TRUE;
int
TOP = -1;

char
s[MAX];
printf("Enter string: ");
gets(c);

//remember that using gets() function is not safe.
for (i = 0; i < strlen(c) / 2; i++)
{


TOP = push(s, TOP, c[i]);
}


for
(; c[i] != '\0'; i++)
{

if
(TOP < 0)
{


valid = FALSE;
break
;
}

else

{


a = pop(s, &TOP);
if
(c[i] != a)
{


valid = FALSE;
}
}
}

if
(valid == TRUE)
{


printf("Valid palindrome string\n");
}

else

{

printf("Invalid palindrome string\n");
}
}


wcwr palindrome using stack

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for wcwr palindrome string
*/


#include<stdio.h>
#define MAX 100
#define TRUE 1
#define FALSE 0


int
push(char *s, int top, char ele)
{


int
i;
if
(top >= MAX)
{


printf("\nStack Overflow");
}
else
{

s[++top] = ele;
}


return
top;
}


int
pop(char *a, int *top)
{


if
((*top) >= 0)
{
(*
top) = (*top) - 1;

return
a[(*top) + 1];
}
else
{

printf("Stack underflow\n");

return
0;
}
}


void
main()
{

int
i;

char
a, b;
char
c[MAX];

int
valid = TRUE;
int
TOP = -1;

char
s[MAX];
//remember that declraing the stack as global is not a good practice (according to my openion)
printf("Enter string: ");
gets(c);

TOP = push(s, TOP, 'c');
for
(i = 0; c[i] != 'c'; i++) // you can modify this string as you want

{ // some people may modify to go upto n/2 etc
TOP = push(s, TOP, c[i]);
}



i++;
for
(; c[i] != '\0'; i++)
{


if
(TOP < 0)
{

valid = FALSE;

break
;
}
else
{

a = pop(s, &TOP);

if
(c[i] != a)
{

valid = FALSE;
}
}

}


if
(TOP == 0)
{

a = pop(s, &TOP);

if
(a != 'c')
{

valid = FALSE;
}
}
else

{

valid = FALSE;
}

if
(valid == TRUE)
{


printf("Valid palindrome string\n");
}
else
{

printf("Invalid palindrome string\n");
}
}


Tuesday, December 28, 2010

stack using array

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for stack using array
*/

#include<stdio.h>
#define SIZE 100


int
peep(int a[], int top, int i)
{


if
( i < 0 && i>= top)
{

printf("This is invalid operation. Index out of range.");
}


else

{

return
a[i];
}
}


int
push(int *a , int top, int ele)
{


if
(top >= SIZE)
{

printf("\nStack Overflow");
}

else


{

a[++top] = ele;
}

return
top;
}


int
pop(int *a,int *top)
{

if
((*top) >=0)
{
(*
top) = (*top) -1 ;

return
a[(*top)+1];
}

else

{

printf("Stack underflow\n");

return
0;
}
}

void
change(int *a,int top, int index, int element)
{


if
(index < 0 || index > top)
{

printf("The index is out of range");
}


else

{

a[index] = element;
}
}



void
main()
{

// void push(int [] ,int ,int );
int i= 0 ;

int
top = -1;
int
a[SIZE];

int
d = 1;
int
temp,temp1;

do

{

printf("\n\nSelect any option");
printf("\n1 Display stack");

printf("\n2 push");
printf("\n3 pop");
printf("\n4 peep");

printf("\n5 change");
printf("\n6 exit\n");
scanf("%d",&d);


switch
(d)
{

case
1:
if
(top>=0)
{


for
(i = 0 ; i <= top ; i++ )
{


printf("\nelement at %d is %d" , i , peep(a,top,i));
}
}


else

{

printf("\nThe stack is empty");
}

break
;
case
2:

printf("Enter number you want to insert in the stack: ");
scanf("%d",&temp);
top = push( a , top , temp);

break
;
case
3:
printf("The popped element is: %d" , pop(a,&top));

break
;
case
4:
printf("At which position you want to peep ? ");
scanf("%d",&temp);

printf("Peeped element is: %d" , peep(a,top,temp) );
break
;

case
5:
printf("Enter the index at which you want to change: ");
scanf("%d",&temp);

printf("Enter he actual element that you want to enter: ");
scanf("%d",&temp1);
change(a,top,temp,temp1);

break
;
default
:
printf("Please enter a valid choice.");
break
;

}
}


while
(d != 6);
// and yes, i think you will be able to writ getch here (on TC3)
// i am on linux so that thing is not available here
}

intersection of two arrays

/****************************
* Umang B Bhatt *
* bhatt.umang7@gmail.com *
*****************************/

/**
* program for intersection of two arrays
*/

#include<stdio.h>
void main()
{


// here for the program of union intersection and minus
// of arrays, we assume that there is no repetation of numbers in
// sinble array
int n1 = 0 , i =0 , n2=0 , j = 0 , no1[100] , no2[100];

int
result[200];
int
r1 = 0 ;

printf("How many numbers you want to scan in first array ? ");
scanf("%d",&n1);
if
(n1 < 0 || n1 > 100 )
{


printf("Invalid number. It must be brtween 1 to 100");
}

else

{

// logic for scanning the numbers
for(i = 0 ; i < n1 ;i++)
{


printf("Enter element %d: ", i);
scanf("%d",&no1[i]);
}
}


printf("How many numbers you want to scan in second array ? ");
scanf("%d",&n2);
if
(n2 < 0 || n2 > 100)
{


printf("Invalid number. It must be brtween 1 to 100");
}

else

{

// logic for scanning the numbers
for(i = 0 ; i < n2 ;i++)
{


printf("Enter element %d: ", i);
scanf("%d",&no2[i]);
}
}



// now the intersection of two arrays
// now we will copy the elements one by one
// if some element exist in both the arrays then only we will copy them
for(i = 0 ; i < n1 ; i++)
{


for
(j = 0 ; j< n2 ; j++ )
{


if
(no1[i] == no2[j] )
{

result[r1++] = no1[i];
}
}
}


// now display the array
printf("\nTHe array (intersection) is : ");
for
(i = 0 ; i < r1 ; i++ )
{


printf(" %d," , result[i] );
}

printf("\b \n");
}