这是给我的任务。 我是菜鸟,刚开始编程。 整个字符串不会压入堆栈以及如何弹出。
问题陈述:-将由全名组成的整个字符串分成三个部分,以获取姓氏中间名和姓氏,并按姓氏中间名的顺序显示它们,仅使用堆栈。>
我尝试使用2D堆栈
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<string>
using namespace std;
using std :: string;
char s1[100];
char s2[50],s3[50],s4[50];
int i=0,j=0,k=0,max1=9,top=-1;
char stack[10][10];
char re[10];
void push(char val[])
{
if(top>=max1)
{
cout<<"Stack overflow";
}
else
{
top++;
int a=0;
for (int i=0;i<stack[top]['\0'];i++)
{
stack[top][a]=val[i];
a++;
}
}
}
char* pop()
{
if(top<0)
{
cout<<"Stack underflow";
}
else
{
//for(int j=0;j<=top)
for(int i=0;i<stack[top]['\0'];i++)
{
re[i]=stack[top][i];
top--;
return re;
}
}
}
void divstring()
{
for(i=0;s1[i]!=' ';i++)
{
s2[i]=s1[i];
}
s2[i]='\0';
i++;
while(s1[i]!=' ')
{
s3[j]=s1[i];
j++;
i++;
}
s3[j]='\0';
i++;
while(s1[i]!='\0')
{
s4[k]=s1[i];
k++;
i++;
}
s4[k]='\0';
i++;
}
int main()
{
//clrscr();
cout<<"Enter the string: ";
gets(s1);
divstring();
cout<<"The 1 part is "<<s2<<endl;
cout<<"The 2 part is "<<s3<<endl;
cout<<"The 3 part is "<<s4<<endl;
// getch();
push(s1);
push(s2);
push(s3);
cout<<pop();
return 1;
}
没有编译时错误,但字符串不会被压入堆栈或弹出。
答案 0 :(得分:2)
这里有多个问题。
没有2D堆栈之类的东西。堆栈是一维的。它有一个可用的结局。在C ++中,您使用std :: stack,push(),pop()和empty()。
您需要摆脱全局变量。
您似乎想实现自己的堆栈。您需要确定是否要实现堆栈,这是一个问题。或者,您是否要使用现有堆栈来执行分配?这是一个不同的问题。我无法分辨两者之间。
您应该使用std :: string。
您不处理边界条件。例如,传递没有空格的字符串将在
中无限循环for(i=0;s1[i]!=' ';i++)
答案 1 :(得分:1)
推送功能非常混乱,这是一个有效的版本
void push(char val[])
{
if (top >= max1)
{
cout << "Stack overflow";
}
else
{
top++;
int i = 0;
for (; val[i] != '\0'; i++)
stack[top][i] = val[i];
stack[top][i] = '\0';
}
}
有许多方法可以改善此问题,您可以使用C strcpy
函数来代替手工复制字符串。或者,天堂禁止,您可以使用某些C ++,例如std::string
和std::stack
。