Biswajit 1
Biswajit 1
Biswajit 1
54
int precedence(char);
void init(stack *);
int empty(stack *);
int full(stack *);
int pop(stack *);
void push(stack *,int );
int top(stack *); //value of the top element
void infix_to_prefix(char infix[],char prefix[]);
void infix_to_postfix(char infix[],char postfix[]);
void eval_prefix(char prefix[]);
void eval_postfix(char postfix[]);
int evaluate(char x,int op1,int op2);
void main()
{ char infix[30],postfix[30],prefix[30];
55
56
prefix[i]=prefix[j];
prefix[j]=temp;
}
}
void infix_to_postfix(char infix[],char postfix[])
{ stack s;
char x;
int i,j;//i-index for infix[],j-index for postfix
char token;
init(&s);
j=0;
for(i=0;infix[i]!='\0';i++)
{ token=infix[i];
if(isalnum(token))
postfix[j++]=token;
else
if(token == '(')
push(&s,'(');
else
if(token == ')')
while((x=pop(&s))!='(')
postfix[j++]=x;
else
{
while(precedence(token)<=precedence(top(&s)) &&
!empty(&s))
{
x=pop(&s);
postfix[j++]=x;
}
push(&s,token);
}
57
}
while(!empty(&s))
{
x=pop(&s);
postfix[j++]=x;
}
postfix[j]='\0';
}
58
stack s;
char x;
int op1,op2,val,i;
init(&s);
for(i=strlen(prefix)-1;i>=0;i--){
x=prefix[i];
if(isalpha(x))
{ printf("\nEnter the value of %c : ",x);
scanf("%d",&val);
push(&s,val);
}
else{
//pop two operands and evaluate
op1=pop(&s);
op2=pop(&s);
val=evaluate(x,op1,op2);
push(&s,val);
} }
val=pop(&s);
printf("\nvalue of expression = %d",val);
}
int evaluate(char x,int op1,int op2){
if(x=='+') return(op1+op2);
if(x=='-') return(op1-op2);
if(x=='*') return(op1*op2);
if(x=='/') return(op1/op2);
if(x=='%') return(op1%op2);
}
int precedence(char x)
{ if(x == '(') return(0);
if(x == '+' || x == '-') return(1);
59
Output:
21. Write a C program to create a stack and do push and pop operations.
#include<stdio.h>
#include<stdlib.h>
structstack{
int size;
int top;
int *arr;
};
//Creating stackdatatype
int check_full(struct stack*ptr){
if(ptr->top==ptr->size-1){
return 1;
}
else{
return 0;
}
}
voidpush(struct stack*ptr, intvar){
if (check_full(ptr) == 1){
//Stack is already full so it will result in stack overflow
printf("StackOverflow, couldnot push%d elementintostack\n"
,var);
}
else{
//Iterating top and inserting the element
ptr->top++;
ptr->arr[ptr->top]=var;
}
int main(){
int n,i,var;
struct stack *s;
s=(structstack*)malloc(sizeof(structstack));
s->size = 10;
s->top = -1;
s->arr=(int*)malloc(s->size*(sizeof(int)));
printf("The stack has been successfully created.\n");
printf("Enter how many elements you want to push:");
scanf("%d"
,&n);
for(i=0; i<n;i++){
printf("Enterthevalueyouwanttopush:");
scanf("%d"
,&var);
push(s,var);
}
printf("\n\n");
printf("Enter how many elements you want to pop:");
scanf("%d",&n);
for(i=0; i<n;i++){
pop(s);
}
return 0;
}
Output:
22. Write a C program to create a stack and do push and pop operations
and
peek the stack.
#include<stdio.h>
#include<stdlib.h>
structstack{
int size;
int top;
int *arr;
};
int check_empty(structstack*s){
if(s->top==-1){
return 1;
}
else{
return 0;
}
}
int check_full(struct stack*s){
if(s->top==s->size -1){
return 1;
}
else
{
return 0;
}
}
voidpush(struct stack*s,intval)
{
if (check_full(s) == 1)
{
printf("StackOverflow, cannotpush%delementinto thestack\n"
,val);
}
else
{
s->top++;
s->arr[s->top]=val;
printf("%dhasbeensuccessfullypushed intothe stack\n"
,val);
}152
}
int pop(structstack*s)
{
if (check_empty(s) == 1)
{
printf("StackUnderflow, cannotpop\n");
return 0;
}
else
{
int val =s->arr[s->top];
s->top--;
printf("%dhasbeensuccessfullypopped fromthestack\n"
,val);
return val;
}
}
int peek(structstack*s,intval)
{
if(s->top-val+ 1<0)
{
printf("Positionnot valid\n");
return -1;
}
else
{
printf("Element%d=%d\n"
, val, s->arr[s->top-val+ 1]);
}
}
int main()
{
int n, v, value;
struct stack *s;
s=(structstack*)malloc(sizeof(structstack));
s->size = 10;
s->top = -1;
s->arr=(int*)malloc(s->size*sizeof(int));
printf("Enter how many elements you want to push:");
scanf("%d"
,&n);
for(inti=0; i<n;i++)
{
printf("Enterthevalueyouwanttopush:");
scanf("%d"
,&v);
push(s, v);
}
printf("\n"); 153
printf("Enter how many elements you want to pop:");
scanf("%d"
,&value);
for(intj=0;j <value; j++)
{
pop(s);
}
for(inti=1; i<=s->top+1; i++)
{
peek(s, i);
}
return 0;
}
Output:
23. Write a C program to create a stack and find stack top and stack
bottom.
#include<stdio.h>
#include<stdlib.h>
Struct stack
{
int size;
int top;
int *arr;
};
int check_empty(structstack*s)
{
if(s->top==-1)
{
return 1;
}
else
{
return 0;
}
}
int check_full(struct stack*s)
{
if(s->top==s->size -1)
{
return 1;
}
else
{
return 0;
}
}
Void push(struct stack*s,intval)
{
if (check_full(s) == 1)
{
printf("StackOverflow, cannotpush%delementinto thestack\n"
,val);
}
else
{
s->top++;
s->arr[s->top]=val;
printf("%d has been successfully pushed into the stack\n"
,val);
}
}
int pop(struct stack*s)
{
if (check_empty(s) == 1)
{
printf("StackUnderflow, cannotpop\n");
return 0;
}
else
{
int val =s->arr[s->top];
s->top--;
printf("%d has been successfully popped from the stack\n"
,val);
return val;
}
}
int peek(struct stack*s,intval)
{
if(s->top-val+ 1<0)
{
printf("Position not valid\n");
return -1;
}
else
{
printf("Element %d=%d\n"
, val, s->arr[s->top-val+ 1]);
}
}
int stack_top(struct stack* s)
{
return(s->arr[s->top]);
}
int stack_bottom(struct stack*s)
{
return(s->arr[0]);
}
int main()
{
int n, v, value;
struct stack *s;
s=(struct stack*)malloc(sizeof(struct stack));
s->size = 10;
s->top = -1;
s->arr=(int*)malloc(s->size*sizeof(int));
printf("Enter how many elements you want to push:");
scanf("%d"
,&n);
for(inti=0; i<n;i++)
{
printf("Enterthevalueyouwanttopush:");
scanf("%d"
,&v);
push(s, v);
}
printf("\n");
for(inti=1; i<=s->top+1; i++)
{
peek(s, i);
}
printf("StackTop=%d\n"
,stack_top(s));
printf("StackBottom=%d"
,stack_bottom(s));
return 0;
}
Output:
return 1;
}
else
{
return 0;
}
}
structnode *push( struct node*ptr,int var)
{
if (is_full(ptr)==1)
{
printf("Stack Overflow\n");
}
else
{
//Creating a node and linking it with the previous top node
structnode *temp;
temp=(structnode *)malloc(sizeof(structnode));
temp->data=var;158
temp->next=ptr;
ptr=temp;
return temp;
}
}
voidstack_traversal(structnode *ptr)
{
printf("\n Stack->\n");
while ( ptr!=NULL)
{
printf("Element:%d\n"
,ptr->data);
ptr=ptr->next;
}
}
//Topisapointer
//variablesowhateverchangeshappenstotopwillnotreflectinmainfunctionunless
//and untill address of top is passed into the function
int pop(structnode**ptr)//Doubledereferencingdoneoneforpointerandsecond
//fordereferencing addressoftop
{//Anotheroptionisusingtopasaglobalvariable
if (is_empty(*ptr)==1)
{
printf("Stack underflow");
}
else
{
structnode *temp=*ptr;
//Assigningapointerto thenodetobedeletedandupdatedtopnodetototop->next
int data=(*ptr)->data;
*ptr=(*ptr)->next;
free(temp);
return data;
}
}
int main()
{
struct node *top;
top =NULL;
int n,val;
printf("Enter the number of stacks:");
scanf("%d",&n);
for(int i=0; i<n;i++)
{
printf("Enter the value you want to insert:");
scanf("%d"
,&val);
top=push(top,val);
}
stack_traversal(top);
printf("Enter the number of stacks you want to pop:");
scanf("%d"
,&n);
for(inti=0; i<n;i++)
{
printf("%d element has bee n popped\n"
,pop(&top));
}
stack_traversal(top);
return 0;
}
Output: