pop() is not working properly - c++

Here is a c++ code on stack.Ignore the extra code here
#include<iostream>
using namespace std;
class mystack
{
private:
int top;
int size;
int * s;
public:
void initialize()
{
top=-1;
cin>>size;
s=new int[size];
}
~mystack(){delete [] s;}
void push()
{
int x;
if(top==size-1)
cout<<"stack overflow!"<<endl;
else
{
cout<<"Enter element to be pushed:";
cin>>x;
top++;
s[top]=x;
cout<<s[top]<<endl;
}
}
int pop()
{
int p=s[top];
if(top==-1)
return 0;
else
{
top--;
return p;
}
}
int maxsize()
{
return size;
}
int isempty()
{
if(top==-1)
return 0;
else
return 1;
}
void display()
{
int i,p=top;
cout<<s[0]<<endl;
for(i=0;i<=p;i++)
cout<<s[i]<<endl;
}
};
int main()
{
int n,i;
cout<<"Enter no. of stacks:";
cin>>n;
mystack * st=new mystack[n];
for(i=0;i<n;i++)
{
cout<<"Enter size of stack "<<i+1<<":";
st[i].initialize();
}
int c,s;
while(1)
{
cout<<"*****Operations*****"<<endl;
cout<<"1.Push 2.Pop 3.Maxsize 4.isempty 5.Display 6.Quit"<<endl;
cout<<"Enter your choice:";
cin>>c;
if(n>1)
{
cout<<"Operation on which stack:";
cin>>s;
}
else
s=1;
if(c==1)
st[s-1].push();
else if(c==2)
{
if(st[s-1].pop()==0)
cout<<"stack underflow!"<<endl;
else
cout<<st[s-1].pop()<<endl;
}
else if(c==3)
cout<<st[s-1].maxsize()<<endl;
else if(c==4)
{
if(st[s-1].isempty()==0)
cout<<"True"<<endl;
else
cout<<"False"<<endl;
}
else if(c==5)
st[s-1].display();
else if(c==6)
break;
else
{
cout<<"Wrong input!"<<endl;
continue;
}
}
return 0;
}
Here accessing pop operation gives the element of top-1.I can't understand why.What should I do?When I do return s[top--] same thing is happening.

Since you haven't gotten back to this, I am going to presume you've already found your logic error.
So here is the one error I found. There may be more, I quit looking ...
In the following code, how many times is pop() being called?
else if(c==2)
{
if(st[s-1].pop()==0)
cout<<"stack underflow!"<<endl;
else
cout<<st[s-1].pop()<<endl;
}

Related

Finding next palindrome of a number, getting SIGABRT error

Hi ,I am trying to solve the question PALIN on SPOJ where the idea is to find the next immediate palindrome of a number. I tested my code on the IDE with all possible test cases I found and the program is working fine but I can't figure out why I am getting SIGABRT error when I submit the solution.Please I request someone help me figure out the problem in the code For yor reference I am providing the link of the question:- https://www.spoj.com/problems/PALIN/
#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
bool all_nines(string s)
{
for(int i=0;i<s.length();i++)
{
if(s[i]!='9')
return false;
}
return true;
}
int reverse(int a)
{
int rev=0;
while(a)
{
rev=(rev*10)+(a%10);
a/=10;
}
return rev;
}
void convert_and_compare(string &s,int low,int high)
{
int low_num,high_num;
string low_str="",high_str="";
for(int i=0,j=high;i<=low,j<s.size();i++,j++)
{
low_str+=s[i];
high_str+=s[j];
}
low_num=stoi(low_str);
high_num=stoi(high_str);
if(reverse(low_num)<=high_num)
{
low_num++;
low_str=to_string(low_num);
high_str="";
for(int i=low_str.length()-1;i>=0;i--)
high_str+=low_str[i];
}
else
{
high_str="";
for(int i=low_str.length()-1;i>=0;i--)
high_str+=low_str[i];
}
s="";
s+=low_str+high_str;
}
void convert_and_compare(string &s,int low,int high,int mid)
{
int low_num,high_num,mid_num;
string low_str="",high_str="";
char mid_str;
for(int i=0,j=high;i<=low,j<s.size();i++,j++)
{
low_str+=s[i];
high_str+=s[j];
}
low_num=stoi(low_str);
high_num=stoi(high_str);
mid_num=(s[mid]-'0');
if(reverse(low_num)>high_num)
{
low_str=to_string(low_num);
high_str="";
for(int i=low_str.length()-1;i>=0;i--)
high_str+=low_str[i];
mid_str=mid_num+'0';
}
else if(reverse(low_num)<=high_num && mid_num!=9)
{
mid_num++;
high_str="";
for(int i=low_str.length()-1;i>=0;i--)
high_str+=low_str[i];
mid_str=mid_num+'0';
}
else if(reverse(low_num)<=high_num && mid_num==9)
{
mid_num=0;
low_num++;
low_str=to_string(low_num);
high_str="";
for(int i=low_str.length()-1;i>=0;i--)
high_str+=low_str[i];
mid_str=mid_num+'0';
}
s="";
s=low_str+mid_str+high_str;
}
string find_next_palin(string s)
{
if(all_nines(s))
{
s[0]='1';
for(int i=1;i<s.length();i++)
s[i]='0';
s+='1';
return s;
}
else
{
if(s.length()%2==0)
{
int low,high;
low=s.length()/2-1;
high=s.length()/2;
convert_and_compare(s,low,high);
return s;
}
else
{
int low,high,mid;
mid=s.length()/2;
low=mid-1;
high=mid+1;
convert_and_compare(s,low,high,mid);
return s;
}
}
}
int main()
{
int t;
scanf("%d",&t);
vector <string> v(t);
for(int i=0;i<t;i++)
{
cin>>v[i];
}
for(int i=0;i<t;i++)
{
if(v[i].length()==1)
{
if(v[i]=="9")
{ printf("11");
printf("\n");
}
else
{
printf("%d",(v[i][0]-'0')+1);
printf("\n");
}
}
else
{
string temp;
temp=find_next_palin(v[i]);
for(int j=0;j<temp.length();j++)
cout<<temp[j];
printf("\n");
}
}
return 0;
}

`iqueue->front` is displaying proper value and is not null.But tempiq is showing NULL and gives segmentation fault.Why?

The while loop in the code gives segmentation fault(because tempiq is NULL).I can't figure out why tempiq is NULL when iqueue->front is displaying proper values and is not null(for sure).
//......previous code
tempiq=iqueue->front;
cout<<"\n"<<iqueue->front->link<<""<<iqueue->front;
if(tempiq)// && iqueue->front)
cout<<"\n aaaaaaaaaaaaaaaaaaaa\t";
while(tempiq)
{
//....rest of code
The full code for reference is given below:(the above code segment is in the main function at the last)
#include <vector>
#include <iostream>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <termios.h>
#include <sstream>
#include <unistd.h>
#include <cstdlib>
#include <ctype.h>
using namespace std;
#define NO_OF_CHARS 256
/* This function builds the TF table which represents Finite Automata for a
given pattern */
void computeTransFun(char *pat, int M, int TF[][NO_OF_CHARS])
{
int i, lps = 0, x;
// Fill entries in first row
for (x =0; x < NO_OF_CHARS; x++)
TF[0][x] = 0;
TF[0][pat[0]] = 1;
// Fill entries in other rows
for (i = 1; i<= M; i++)
{
// Copy values from row at index lps
for (x = 0; x < NO_OF_CHARS; x++)
TF[i][x] = TF[lps][x];
// Update the entry corresponding to this character
TF[i][pat[i]] = i + 1;
// Update lps for next row to be filled
if (i < M)
lps = TF[lps][pat[i]];
}
}
/* Prints all occurrences of pat in txt */
int searchauto(char *pat, char *txt)
{
int M = strlen(pat);
int N = strlen(txt);
int TF[M+1][NO_OF_CHARS];
computeTransFun(pat, M, TF);
int flag=0;
// process text over FA.
int i, j=0;
for (i = 0; i < N; i++)
{
j = TF[j][txt[i]];
if (j == M)
{
return flag;
//printf ("\n pattern found at index %d", i-M+1);
}
}
return flag;
}
class Node
{
char content;
bool marker;
vector <Node*>children;
public:
Node(){ content='\0'; marker=false; }
~Node(){}
void setContent(char c){content=c; }
void setMarker(){this->marker=true; }
char getContent(){return content; }
bool getMarker(){return marker; }
Node *findChild(char c);
void appendChild(Node *child)
{ children.push_back(child); }
vector<Node *> getChildren()
{ return children; }
};
class Trie
{
public:
Node *root;
int abc;
void addWord(string s);
void deleteWord(string s);
bool searchWord(string s);
Trie(){ root=new Node(); }
~Trie(){}
};
Node *Node::findChild(char c)
{
for(int i=0; i< children.size(); i++)
{
Node *temp=children.at(i);
if(temp->content==c)
return temp;
}
return NULL;
}
void Trie:: addWord(string s)
{
//cout<<"\naddword called for "<<s<<"::::::::::::::::::::::::\n";
Node *current=root;
if(s.length()==0)
{ cout<<"\txxxx\t"; current->setMarker(); return ; }
for(int i=0;i<s.length();i++)
{
Node *child=current->findChild(s[i]);
if(child!=NULL)
current=child;
else
{
Node *tmp=new Node();
tmp->setContent(s[i]);
current->appendChild(tmp);
current=tmp;
}
if(i==s.length()-1)
current->setMarker();
cout<<"\ttrying\t";
}
cout<<"\n word added\t";
}
bool Trie::searchWord(string s)
{
cout<<"\nsearchWord called for "<<s<<endl;
Node *current=root;
cout<<"\n search started\t";
cout<<endl;
while(current !=NULL)
{
cout<<"\t00\t";
for(int i=0;i<s.length();i++)
{
cout<<s[i]<<" ";
Node *temp=current->findChild(s[i]);
if(temp==NULL)
return false;
current=temp;
}
cout<<endl;
int a;
// cin>>a;
if(current->getMarker())
{
cout<<"String found......................................................................................................\n";
return true;
}
else
{
cout<<"Sorry string not found in trie....................................................................................\n";
return false;
}
}
}
struct node
{
struct node *next;
int rank;
int nopage;
Trie *trie;
string value;
};
struct indexqueue
{
struct indexnode *front;
struct indexnode *rear;
};
struct indexqueue *createindexqueue()
{
struct indexqueue *temp=new indexqueue;
temp->front=NULL;
temp->rear=NULL;
//temp->count=0;
return temp;
}
struct indexnode
{
int id;
int rank;
int *point2[];
string link;
Trie *down;
struct indexnode *next;
};
struct indexnode *createindexnode(string val)
{
struct indexnode *temp=new indexnode;
temp->next=NULL;
//temp->value=val;
//cout<<"Node created with val: "<<val<<endl;
return temp;
}
struct indexqueue *iqueue;
struct queue
{
struct node *front;
struct node *rear;
int count;
};
struct node *createnode(string val)
{
struct node *temp=new node;
temp->next=NULL;
temp->value=val;
//cout<<"Node created with val: "<<val<<endl;
return temp;
}
struct queue *createqueue()
{
struct queue *temp=new queue;
temp->front=NULL;
temp->rear=NULL;
temp->count=0;
return temp;
}
struct queue *pop(struct queue *queue1)
{
struct node *temp=new node;
if(queue1->front==NULL)
return NULL;
else if(queue1->front==queue1->rear)
{
queue1->front=NULL;
queue1->rear=NULL;
}
else
{
queue1->front=queue1->front->next;
}
return queue1;
}
struct queue *push(string val, struct queue *queue1)
{
struct node *new1=createnode(val);
if(queue1->front==NULL && queue1->rear==NULL)
{
queue1->front=queue1->rear=new node;
queue1->rear=new1;
queue1->front=new1;
//cout<<"1\n";
}
else
{
queue1->rear->next=new node;
queue1->rear->next=new1;
queue1->rear=queue1->rear->next;
//cout<<"2\n";
}
queue1->count++;
return queue1;
}
void inserttrie(struct queue *queue1,string value,string collection[],int n)
{
struct node *temp=queue1->front;
while(temp!=NULL)
{
if(temp->value.compare(value)==0)
{
temp->nopage=n;
for(int i=0;i<n;i++)
temp->trie->addWord(collection[i]);
}
}
}
void display(struct queue *queue1)
{
if(!queue1->front)
{
cout<<"Queue empty\n";
return;
}
struct node *temp=queue1->front;
while(temp)
{
cout<<temp->value<<"\n";
temp=temp->next;
}
}
void pushindex(struct indexnode *temp)
{
if(iqueue->front==NULL && iqueue->rear==NULL)
{
iqueue->front=temp;
iqueue->rear=temp;
}
else
{
iqueue->rear->next=temp;
iqueue->rear=temp;
}
}
int search(struct queue* queue1,string val) //returns 1 if val found in queue1 else 0
{
if(queue1->front==NULL)
return 0;
struct node *temp=new node;
temp=queue1->front;
while(temp)
{
if(val.compare(temp->value)==0)
return 1;
temp=temp->next;
}
return 0;
}
int globalcounter=23456;
struct queue *bot(struct queue *crawl,ifstream& infile,string text)
{
struct indexnode *newnode=new indexnode;
//cout<<"\n"<<text<<"\toooooooooooo\n";
newnode->link=text;
newnode->down=new Trie;
newnode->down->abc=globalcounter++;
//cout<<"\n"<<newnode->link<<"\toooooooooooo\n";
newnode->next=NULL;
//indexnode->nop=0;
//Trie *word=new Trie;
if(infile==NULL)
return NULL;
cout<<"BOT_START\n";
string line;
string tri[10000];
//char *v;
string v;
string mxy;
int n=0;
while(getline(infile,line))
{
string link="";
cout<<"\n "<<line<<"\t\n";
int i=0,flag=0,flag1=0,x=0,m=0;
tri[x]="";
for(i=0;i<line.length()-1;i++)
{
if(line[i]==' '||line[i]=='*' && line[i+1]=='*'||line[i]=='*'||line[i]==';'||line[i]=='.'||line[i]=='/')
{
x++;
//tri[x-1][m]='\0';
//v+='\0';
//cout<<"\n***********************************************************"<<v<<endl;
cout<<"\n";
tri[x-1]=v;
newnode->down->addWord(v);
if(newnode->down->searchWord(v))
{
int a;
cout<<"HHHHHHHHHHHHHUUUUUUUUUUUUUUUUUUUUUURRRRRRRRRRRRRRRRRRRRRAAAAAAAAAAAAAYYYYYYYYYYYYYY\n";
cout<<newnode->down->abc<<endl;
//cin>>a;
}
mxy=v;
v="";
m=0;
//tri[x]="";
}
else
{
v+=line[i];
//tri[x][m]=line[i];
cout<<" "<<tri[x][m++]<<" "<<line[i]<<" "<<v;
}
//cout<<"\t.....miiii...miiii....."<<tri[x]<<" ";
if(line[i]=='*' && line[i+1]=='*' && flag==0)
{
flag=1;
i+=2;
}
if(line[i]=='*' && line[i+1]=='*' && flag==1)
{
flag=0;
flag1=1;
i+=2;
}
if(flag==1 && flag1==0)
{
link+=line[i];
}
if(flag1==1)
{
link+='\0';
n++;
cout<<"\nLink:"<<link<<endl;
if(search(crawl,link)==0)
{
cout<<"Link not found in queue\n";
crawl=push(link,crawl);
}
else
cout<<"Link found in queue\n";
link="";
flag1=0;
}
//
//
//
//
}
}
int xt;
//newnode->down=word;
if(!newnode->down)
{
int a;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
//cin>>a;
}
//cout<<"````````````````````````` "<<newnode->down->abc;
//int a;
//cout<<newnode->down;
//cin>>a;
/*if(newnode->down->searchWord(" ")||newnode->down->searchWord("This")||newnode->down->searchWord(mxy))
{
int a;
cout<<"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n";
cin>>a;
cin>>a;
}*/
//cout<<newnode->down->root->getMarker();
//cin>>a;
//cin>>xt;
//displayIndexQueue();
pushindex(newnode);
infile.close();
cout<<"BOT_END\n";
return crawl;
}
struct queue *merge(struct queue *queue1,struct queue *queue2)
{
if(queue1->front==NULL)
return queue2;
else if(queue2->front==NULL)
return queue1;
else
{
struct node *temp=queue2->front;
while(temp)
{
if(search(queue1,temp->value)==0)
queue1=push(temp->value,queue1);
temp=temp->next;
}
/*queue1->rear->next=queue2->front;
queue1->rear=queue1->rear->next;*/
return queue1;
}
}
/*struct queue *checkduplicate(struct queue *queue1,struct queue *queue2)
{
if(queue1->front==NULL || queue2->front==NULL)
return NULL;
struct queue *tempqueue=createqueue();
struct node *temp=queue1->front;
while(temp)
{
if(search(queue2,temp->value)==0)
{
tempqueue=push(temp->value,tempqueue);
}
temp=temp->next;
}
return tempqueue;
}*/
struct queue *spider(struct queue *crawl,ifstream& infile,string text)
{
struct queue *queue1=createqueue();
if(infile==NULL)
return NULL;
queue1=bot(queue1,infile,text);
if(queue1->front==NULL) //check whether there are no links in the queue1
return crawl;
cout<<"SPIDER:Linked list returned by bot:\n";
display(queue1);
cout<<"\n";
cout<<"SPIDER:Displaying crawl before merge:\n\n";
display(crawl);
crawl=merge(crawl,queue1);
//queue1=checkduplicate(queue1,crawl);
cout<<"SPIDER:Displaying crawl after merge:\n\n";
display(crawl);
cout<<"\n";
struct node *temp=queue1->front;
while(temp)
{
ifstream infile1;
char *link=new char[((temp->value).length())+1];
strcpy(link,(temp->value).c_str());
infile1.open(link);
cout<<"Spider is inside : "<<link<<endl;
crawl=spider(crawl,infile1,string(link));
temp=temp->next;
}
return crawl;
}
void displayIndexQueue()
{
if(iqueue->front==NULL)
{
cout<<"iqueue is empty----------------------------------------------\n";
return;
}
struct indexnode *temp=iqueue->front;
while(temp)
{
cout<<temp->link<<endl;
//cout<<"6666666666666666666666666666666666666666666666666666666666666666666666\n";
//if(temp->link=="/home/abhishek/Desktop/eco/testproject2_1_1.txt")
//{
if(temp->down->searchWord("this"))
{
cout<<"this FOUND\n000000000000000000000000000=====================================================================000000000";
}
if(temp->down->searchWord("This"))
{
cout<<"This FOUND\n000000000000000000000000000=====================================================================000000000";
}
if(temp->down->searchWord("movie"))
{
cout<<"MOVIE FOUND\n000000000000000000000000000=====================================================================000000000";
}
cout<<"INSIDE IF OF displayIndexQueue\n";
//cout<<endl<<temp->link<<" &&&&&&&&&&& ";
temp=temp->next;
}
}
struct user
{
string first_name;
string last_name;
int age;
string email;
string password;
};
struct user users[100];
int globalcount;
int validatename(string name)
{
int len=name.length(),flag=0,i=0;
while(flag==0 && i<len)
{
if(!((name[i]>='a' && name[i]<='z') || (name[i]>='A' && name[i]<='Z')))
{
flag=1;
break;
}
i++;
}
if(flag==0)
{
return 1;
}
else
{
return 0;
}
}
int validateemail(string email)
{
if(!((email[0]>='a' && email[0]<='z') || (email[0]>='A' && email[0]<='Z')))
return 0;
int len=email.length();
int a=0,b=0,c=0;
for(int i=0;i<len;i++)
{
if(email[i]=='#')
a=i;
else if(email[i]=='.')
b=i;
}
if(b<a+2)
return 0;
if(b==len-1 ||b==len-2)
return 0;
return 1;
}
int getch() {
struct termios oldt, newt;
int ch;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fflush(stdin);
return ch;
}
string inputpassword()
{
char password[100];
for(int i=0;i<100;i++)
{
char ch;
ch=getch();
if(ch=='\n')
break;
password[i]=ch;
cout<<"*";
}
return (string)password;
}
int validatepassword(string password)
{
int a=0,b=0,c=0,d=0;
int len=password.length();
if(len<6)
return 0;
for(int i=0;i<len;i++)
{
if(password[i]>='A' && password[i]<='Z')
a++;
else if(password[i]>='a' && password[i]<='z')
b++;
else if(password[i]>='0' && password[i]<='9')
c++;
else
d++;
}
if(a==0 || b==0 || c==0 || d==0)
return 0;
return 1;
}
string encrypt(string input)
{
int len=input.length();
for(int i=0;i<len;i++)
{
if(i%2==0)
input[i]=input[i]+5;
else
input[i]=input[i]-5;
}
return input;
}
string decrypt(string line)
{
int templ=line.length();
int count_spaces=0,odd=0;
for(int i=0;i<templ;i++)
{
if(line[i]==' ')
{
odd=-1;
count_spaces++;
}
if(count_spaces==2)
{
if(line[i]!=' ')
{
line[i]=line[i];
}
}
else
{
if(line[i]!=' ')
{
if(odd%2==0)
line[i]=line[i]-5;
else
line[i]=line[i]+5;
}
}
odd++;
}
return line;
}
int checkexisting(string email)
{
cout<<"checkexisting called\n";
for(int i=0;i<=globalcount;i++)
{
if(users[i].email.compare(email)==0)
{
cout<<"checkexisting returning 1\n";
return 1;
}
}
cout<<"checkexisting returning 0\n";
return 0;
}
struct user *sign_up()
{
string first_name1,last_name1,email1,password1,password2;
int age1;
char test;
cout<<"\nHere are a few syntax rules for signing up on Black Box:\n";
cout<<"1.Age must not be less than 12 years.\n";
cout<<"2.First name and Last name fields will accept only alphabets.\n";
cout<<"3.email address must be of the form 'user#example.com'.\n";
cout<<"4.Password must be at least 6 characters in length and must include at least one upper case";
cout<<" alphabet,one lower case alphabet,one numeral and one special character.\n\n\n";
cout<<"First Name: ";
getline(cin,first_name1);
while(validatename(first_name1)==0)
{
cout<<"Invalid first name entered.\n";
cout<<"\nFirst name can have only alphabets(no spaces,no special characters and no numerals.\n";
cout<<"Enter your first name again: ";
getline(cin,first_name1);
}
cout<<"\nLast Name: ";
getline(cin,last_name1);
while(validatename(last_name1)==0)
{
cout<<"Invalid last name entered.\n";
cout<<"\nLast name can have only alphabets(no spaces,no special characters and no numerals.\n";
cout<<"Enter your last name again: ";
getline(cin,last_name1);
}
cout<<"\nAge: ";
cin>>age1;
if(age1<12)
{
cout<<"Sorry, but according to our TERMS OF USE, no user of age less than 12 can be allowed ";
cout<<"to create an account on Black Box.\n";
return NULL;
}
fflush(stdin);
cin.ignore();
cout<<"\nEmail address : ";
getline(cin,email1);
while(validateemail(email1)==0 || checkexisting(email1)==1)
{
if(validateemail(email1)==0)
{
cout<<"\nInvalid email entered.\n";
cout<<"Email address can only be of the form abc#xyz.pqr.\n";
cout<<"Enter the email address again: ";
}
if(checkexisting(email1)==1)
{
cout<<"\nEmail id already registered.\nChoose a new one.\n";
}
cout<<"\nEnter Email address again: ";
getline(cin,email1);
}
cout<<"\nChoose a password: ";
password1=inputpassword();
cout<<"\nRetype Password: ";
password2=inputpassword();
while(validatepassword(password1)==0 || password1.compare(password2)!=0)
{
if(validatepassword(password1)==0)
{
cout<<"Invalid password enterd.\n";
cout<<"Password must be at least 6 characters in length and must include at least";
cout<<" one upper case alphabet,one lower case alphabet,one numeral and one special character.\n";
}
if(password1.compare(password2)!=0)
{
cout<<"\nPasswords do not match.\n";
}
cout<<"Enter the password again: ";
password1=inputpassword();
cout<<"\nRetype Password: ";
password2=inputpassword();
}
struct user *newuser=new user;
newuser->first_name=first_name1;
newuser->last_name=last_name1;
newuser->age=age1;
newuser->email=email1;
newuser->password=password1;
ofstream outfile("userfile.txt",ios::app);
if(outfile)
{
outfile<<encrypt(newuser->first_name)<<" "<<encrypt(newuser->last_name)<<" "<<newuser->age<<" "<<encrypt(newuser->email)<<" "<<encrypt(newuser->password)<<endl;
}
outfile.close();
return newuser;
}
struct user extract(string line)
{
int len=line.length();
int spaces=0;
string first="",last="",age="",email="",password="";
for(int i=0;i<len;i++)
{
if(line[i]==' ')
spaces++;
else
{
if(spaces==0)
first+=line[i];
else if(spaces==1)
last+=line[i];
else if(spaces==2)
age+=line[i];
else if(spaces==3)
email+=line[i];
else
password+=line[i];
}
}
struct user newuser;
newuser.first_name=first;
newuser.last_name=last;
stringstream convert(age);
newuser.age=0;
convert>>newuser.age;
newuser.email=email;
newuser.password=password;
return newuser;
}
int loadusers()
{
string line;
ifstream infile;
infile.open("userfile.txt");
if(!infile)
return 0;
while(getline(infile,line))
{
globalcount++;
line=decrypt(line);
users[globalcount]=extract(line);
}
}
int login()
{
string email,password;
char choice='y';
while(choice=='y'||choice=='Y')
{
cout<<"\nEnter email address: ";
cin>>email;
cout<<"\nEnter password: ";
cin>>password;
int flag1=0,cur=-1;
for(int i=0;i<=globalcount;i++)
{
if(email.compare(users[i].email)==0 && password.compare(users[i].password)==0)
{
cur=i;
flag1=1;
break;
}
}
if(flag1==1)
{
cout<<"Welcome "<<users[cur].first_name<<endl;
break;
}
else
{
cout<<"Wanna try again?(y/n): ";
cin>>choice;
}
}
if(choice=='y'|| choice=='Y')
return 1;
else
return 0;
}
int account_info()
{
int choice=0,m=1;
cout<<"1.Sign up\n2.Log in\n3.Continue without an account\n4.Exit from Black Box.\nEnter your choice: ";
cin>>choice;
fflush(stdin);
cin.ignore();
struct user *new_user=NULL;
switch(choice)
{
case 1:
new_user=new user;
new_user=sign_up();
if(new_user==NULL)
{
cout<<"Sign up failed.";
choice=3;
}
else
{
cout<<"Successful Sign up.\n";
ofstream outfile;
string newusernamefile="/home/aakash/project/users/"+encrypt(new_user->email)+".txt";
//char *newusernamefile1=newusernamefile.c_str();
outfile.open(newusernamefile.c_str());
outfile<<new_user->first_name;
outfile.close();
break;
}
case 2:
if(login()==1)
{
cout<<"Successful login.\n";
break;
}
else
{
cout<<"Login failed.\n";
choice=3;
}
case 3:
cout<<"Welcome to Black Box3.\n";
break;
case 4:
exit(0);
break;
default:
cout<<"Wrong choice.\n";
};
if(new_user)
{
cout<<"\nThe details entered are:\n";
cout<<new_user->first_name<<endl;
cout<<new_user->last_name<<endl;
cout<<new_user->age<<endl;
cout<<new_user->email<<endl;
cout<<new_user->password;
}
cout<<endl<<endl;
return 1;
}
void displayusers()
{
for(int i=0;i<=globalcount;i++)
{
cout<<"\n"<<users[i].first_name<<" "<<users[i].last_name<<" "<<users[i].age<<" "<<users[i].email<<" "<<users[i].password;
}
cout<<endl;
}
int main()
{
globalcount=-1;
int temp1=loadusers();
if(globalcount!=-1)
displayusers();
int temp=account_info();
int a;
//cin>>a;
struct queue *crawl=createqueue();
iqueue=new indexqueue;
iqueue->front=NULL;
iqueue->rear=NULL;
string text;
text="inputproject.txt";
ifstream infile;
infile.open("inputproject.txt");
if(!infile)
{
cout<<"inputproject.txt not open\n";
return 0;
}
else
cout<<"inputproject.txt successfully opened\n";
crawl=spider(crawl,infile,text);
cout<<"Hey\n";
if(crawl->front==NULL)
return 1;
cout<<"main:Displaying crawl\n";
Trie *dummy=new Trie;
dummy->addWord("movie");
dummy->addWord("harry potter");
dummy->addWord("rajnikanth");
if(dummy->searchWord("movie"))
{
cout<<"MOVIE FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
}
if(dummy->searchWord("harry potter"))
{
cout<<"harry potter FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
}
if(dummy->searchWord("rajnikanth"))
{
cout<<"rajnikanth FOUND IN DUMMY^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n";
}
cout<<iqueue->front->down;
display(crawl);
displayIndexQueue();
string searchstring;
cout<<"\n Enter the string you want to enter\t";
getline(cin,searchstring);
string arraystring[20];int m=0,n=0;
for(int i=0;i<20;i++)
arraystring[i]="";
for(int i=0;i<searchstring.length();i++)
{
cout<<"\n segregating string\t";
if(searchstring[i]==' ')
{
m=m+1;
arraystring[m]="";
cout<<"AAAAAAAAAAA\n";
}
else
{
arraystring[m]+=searchstring[i];
cout<<"BBBBBBBBBBBB\n";
}
/*if((searchstring[i]>='a'&&searchstring[i]<='z')||(searchstring[i]>='A'&&searchstring[i]<='Z')||searchstring[i]=='/'||searchstring[i]=='_')
{
arraystring[m]+=searchstring[i] ;
cout<<"\n adding to array\t";
}
else
{
m++;
//n=0;
cout<<"\n incrementing 1\t";
}*/
}
//Searching for individual string to be as a part of links we crawled "State Automata Search"
cout<<"\n"<<iqueue->front->link<<"\n-------------------\t";
indexqueue iqu[m];
struct indexnode *tempiq;
for(int x=0;x<m;x++)
{
cout<<"\n 11111111111111\t";
//iqu[x]=new createindexqueue();
//=createindexnode(" ");
tempiq=iqueue->front; //above mentioned code segment
cout<<"\n"<<iqueue->front->link<<""<<iqueue->front<<"\t________________________";
if(tempiq)// && iqueue->front)
cout<<"\n aaaaaaaaaaaaaaaaaaaa\t";
while(tempiq)
{
cout<<"\n entered the tempiq inorder to search\t";
indexnode *temp;
temp=(iqu[x].front);
char *c,*c2;
strcpy(c,(tempiq->link).c_str());
strcpy(c2,arraystring[x].c_str());
if(searchauto(c2,c))
{
cout<<"\n checking for automata\t";
while(temp)
{
cout<<"\n entered while\t";
if(temp->next!=NULL)
temp=temp->next;
else
{
cout<<"\n creaing indexes\t";
indexnode *am=createindexnode(tempiq->link);
temp->next=am;
}
}
}
tempiq=tempiq->next;
}
}
for(int i=0;i<m;i++)
{
indexqueue q=iqu[i];
indexnode *qt=q.front;
while(qt)
{
cout<<"---"<<qt->link<<"---";
qt=qt->next;
cout<<"\n";
}
cout<<"\n\n\n";
}
//cout<<endl<<iqueue->front->down->abc<<endl;
//cout<<iqueue->rear->down->abc;
cout<<endl;
return 1;
}
I'm not sure that it's the problem that cause your segmentation fault but... it's a problem.
With the following instructions
char *c,*c2;
strcpy(c,(tempiq->link).c_str());
strcpy(c2,arraystring[x].c_str());
if(searchauto(c2,c))
you write, with strcpy(), in a couple undefined (c and c2 are uninitialized) and unallocated memory areas.
Are you sure that you need to copy this couple of std::string in char * pointed area?
In this case, you should allocate the needed memory; something like this
char *c,*c2;
c = new char[(tempiq->link).size()+1U];
c2 = new char[arraystring[x].size()+1U];
strcpy(c,(tempiq->link).c_str());
strcpy(c2,arraystring[x].c_str());
if(searchauto(c2,c))
But remember to delete [] c and c2.
This if you really need a couple of allocated char *.
But I suppose you can simply pass the c_str() value of this couple of std::string to searchauto()
if(searchauto((tempiq->link).c_str(), arraystring[x].c_str()))
if you define const the parameters of searchauto()
int searchauto(const char *pat, const char *txt)
and the first one of computeTransFun()
void computeTransFun(const char *pat, int M, int TF[][NO_OF_CHARS])
p.s.: sorry for my bad English.

incorrect output when using testcases else it's working fine(stacks used)

below i have uploaded a code to check if there parentheses in a string are balanced or not using stacks.It is working for 1 input,but for multiple testcases the correct output is not working.PLEASE HELP.THANKS IN ADVANCE.
int main()
{
int t;
cin >>t;
cin.ignore();
while(t--)
{
{
stack s;
char *st;
st=new char[100];
gets(st);
s.create(strlen(st));
if(!count_elem(st))//counts if the brackets are in pairs or not
cout << "NO" <<endl;
else
func1(s,st);
}
}
return 0;
}
void func1(stack s,char *st)
{
static int i=0,flag=0;
// printf("%d %d\n",i,flag);
if(st[i]=='(' || st[i]=='{' || st[i]=='[')
{
flag=1;
s.push(st[i]);
}
else
{
if(s.isEmpty())
flag=0;
else
{
if(st[i]=='}')
{
//printf("%c\n",s.get_top());
if(s.get_top()=='{')
{
flag=1;
s.pop();
}
else
flag=0;
}
if(st[i]==')')
{
//printf("%c\n",s.get_top());
if(s.get_top()=='(')
{
flag=1;
s.pop();
}
else
flag=0;
}
if (st[i]==']')
{
//printf("%c\n",s.get_top());
if(s.get_top()=='[')
{
flag=1;
s.pop();
}
else
flag=0;
}
}
}
i++;
if(flag==1)
{
if(i<strlen(st))
func1(s,st);
else
cout << "YES"<<endl;
}
else
cout << "NO"<< endl;
}
The problem is...when the program goes from one testcase to another,it does not reinitialize i=0,flag=0...because they have been declared as static variables.What can be done instead is....declare i,flag globally....and assign i=0;flag=0; just before making the first func()call for every testcase....
int main()
{
int t;
cin >>t;
cin.ignore();
while(t--)
{
{
stack s;
char *st;
st=new char[100];
gets(st);
s.create(strlen(st));
if(!count_elem(st))
cout << "NO" <<endl;
else
{
i=0;
flag=0;
func1(s,st);
}
delete []st;
}
}
return 0;
}

Stack data structure array is not being recognized in functions

I have written C++ code for a stack. I am getting an error that array 'a' has not been declared in the scopes of push, pop and display functions. I have tried to remove private but the problem still persists. How can I fix this?
My code:
#include<iostream>
using namespace std;
class stack
{
private:
int n;
int a[10];
int top;
public:
stack(int n);
void push(int x);
int pop();
void display();
};
stack::stack(int q)
{
n=q;
top=-1;
}
void stack::push(int x)
{
if(top==n-1)
cout<<"\nStack overflow\n";
else
a[++top]=x;
}
int stack::pop()
{
if(top==-1)
cout<<"\nStack is empty\n";
else
return (a[top--]);
}
void stack::display()
{
int i;
for(i=top;i>=0;i--)
cout<<a[i]<<endl;
}
int main()
{
int n;
cout<<"\nEnter the size of stack\n";
cin>>n;
stack st(n);
int i,x;
while(1)
{
cout<<"\nSelect option 1.Push 2.Pop 3.Display\n";
cin>>i;
switch(i)
{
case 1: cin>>x;
st.push(x);
break;
case 2: st.pop();
break;
case 3: st.display();
break;
}
}
return 0;
}

Recursively reverse a stack

I need to reverse a stack using recursion in C++. I can only use pop, push, and reverseStack, no additional functions such as insertAtBottom which I've found while search stackoverflow and the web.
I've tried:
void Stack::reverseStack(){
if (isEmpty())
return;
else{
int x;
pop(x);
reverseStack();
push(x);
}
}
but this creates a stack exactly the same as the original.
You will need to implement a function to insert an item at the bottom an example is
void Stack::insertAtBottom(int item) {
if(isEmpty())
push(item);
else {
int x;
pop(x);
insertAtBottom(item);
push(x);
}
}
At which point you can implement your reverse as follows
void Stack::reverseStack(){
if (isEmpty())
return;
else{
int x;
pop(x);
reverseStack();
insertAtBottom(x);
}
}
EDIT:
If they need to be in one function, the following is a combination of the two
void Stack::reverseStack(bool reverse=true,int item=0){
if(reverse) {
if (isEmpty())
return;
else{
int x;
pop(x);
reverseStack();
reverseStack(false,x);
}
} else {
if(isEmpty())
push(item);
else {
int x;
pop(x);
reverseStack(false,item);
push(x);
}
}
}
Cheers!
#include <iostream>
#include <stack>
using namespace std;
stack<int> S, R; // S is original stack, R is reversed stack
void reverseStack() {
if(!S.empty()) {
R.push(S.top());
S.pop();
reverseStack();
}
return;
}
int main() {
S.push(1);
S.push(2);
S.push(3);
S.push(4);
S.push(5);
reverseStack();
// Check if R is reversed
while(!R.empty()) {
cout << R.top() << " ";
R.pop();
}
return 0;
}
Hope this helps!
here is a solution to this problem in C language:
#include <stdio.h>
// functions that can be used push(), pop(), and isEmpty()
// the idea is to hold all the values in Function Call Stack until the stack becomes empty.
//When the stack becomes empty, we insert all the held items one by one at the bottom of the stack
// stack-> 1 2 3 4 becomes 4 3 2 1 when we print
#define size 4
int stk[size];
int top = -1;
void insertAtLast(int element);
int isStackFull()
{
if(top == size - 1)
return 1;
return 0;
}
void push(int val)
{
if(isStackFull()==1)
return;
else
//Task 2: Complete the logic
stk[++top] = val;
}
int isStackEmpty()
{
//Task 1: Write logic for isStackEmpty()
if (top==-1)
return 1;
return 0;
}
int pop()
{
if(isStackEmpty()==1)
return -1;
else
//Task 2: Complete the logic
return stk[top--];
}
void reverse(){
if(isStackEmpty()==1){
return;
}
int temp=pop();
reverse();
insertAtLast(temp);
}
void insertAtLast(int element){
if(isStackEmpty()==1){
push(element); //imp
return;
}
int topElements=pop(); //imp
insertAtLast(element); //imp
push(topElements);
}
int main() {
push(4);
push(3);
push(2);
push(1);
for(int i=0;i<size;i++){
printf("%d ", stk[i]);
}
printf("\n");
reverse();
for(int i=0;i<size;i++){
printf("%d ", stk[i]);
}
return 0;
}