【问题标题】:Why won't the string push or pop in stack [closed]为什么字符串不会推入或弹出堆栈[关闭]
【发布时间】:2019-08-08 19:59:05
【问题描述】:

这是给我的任务。 我是一个刚开始编程的菜鸟。 字符串作为一个整体不会压入堆栈以及如何弹出它。

问题陈述:- 将一个由全名组成的整个字符串分割,将字符串分成3部分得到名字中间名和姓氏,并按照姓氏名字中间名的顺序显示它们仅使用堆栈。

我尝试过使用 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;
}

没有编译时错误,但字符串不会被压入堆栈或弹出。

【问题讨论】:

  • 听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programsDebugging Guide
  • 你认为这个位在做什么? stack[top]['\0']
  • 无论哪一本 C++ 书籍告诉你使用gets()——你需要再买一本 C++ 书籍。无论哪位教练告诉你使用它,你都需要换一个教练。
  • 你为什么不用std::stack
  • push(s1); push(s2); push(s3); 应该是push(s2); push(s3); push(s4); 吗?我猜s1 太大了,不适合你的“堆栈”

标签: c++ string data-structures


【解决方案1】:

这里有多个问题。

没有二维堆栈这样的东西。堆栈是一维的。它有一个可用的末端。在 C++ 中,您使用 std::stack、push()、pop() 和 empty()。

你需要摆脱全局变量。

您似乎想实现自己的堆栈。您需要决定,是否要实现堆栈,这是一个问题。或者,您想使用现有堆栈来执行分配吗?那是一个不同的问题。这两者我分不清。

你应该使用 std::string。

您不处理边界条件。例如传递一个没有空格的字符串将在

中无限循环
for(i=0;s1[i]!=' ';i++)

【讨论】:

    【解决方案2】:

    推送功能很混乱,这里有一个工作版

    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::stringstd::stack

    【讨论】:

    • 感谢我实现了它
    • pop 功能需要更新吗??
    • 是的,这也不起作用,循环又是错误的。我不知道你认为i&lt;stack[top]['\0'] 在做什么,但这是不对的。我会让你考虑那个。
    • 感谢您的帮助
    猜你喜欢
    • 2011-04-22
    • 2022-01-21
    • 1970-01-01
    • 2014-10-02
    • 2018-06-12
    • 2021-12-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多