使用堆栈反转字符串对我来说不起作用

时间:2017-11-27 07:22:16

标签: c stack

所以我正在编写一个代码来使用堆栈反转字符串,但输出总是

似乎错了,任何人都可以告诉我们这个问题是什么?!

当我写一个像hello这样的字符串时,输出应该是“olleh”但是它的“ollo” 知道为什么会发生这种情况

代码为:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 101

void push(char );
void pop();
char Top();
void print();



char A[MAX_SIZE];
int top=-1;

void rev(int n)
{
    int i;
    for(i=0; i<n; i++){
        push(A[i]);
    }
    for(i=0; i<n; i++){
        A[i]=Top();
        pop();
    }

}

void main()
{

    printf("enter a string: ");
    gets(A);
    rev(strlen(A));
    printf("output= %s",A);
}

void push(char a)
{
    if (top == MAX_SIZE -1){
        printf("Error: stack overflow\n");
        return;
    }
    A[++top] = a;
}

void pop()
{
    if(top==-1){
      printf("Error: stack is empty\n");
        return;
    }
    top--;
}

char Top()
{
    return A[top];
}

void print()
{
    int i;
    printf("Stack: ");
    for(i=0;i<=top;i++){
        printf("%d ",A[i]);
    }
    printf("\n");
}

这是屏幕截图中的输出

the output

3 个答案:

答案 0 :(得分:1)

你快到了!

首先,不要使用危险获取(),而是使用fgets

    fgets(A,MAX_SIZE,stdin);

然后反向函数几乎没问题,但你要覆盖相同的字符串,重新使用(从字符串的一半)字符,你只是从尾部(堆栈/字符串)复制。

使堆栈成为另一个数组

char A[MAX_SIZE]; // input string
char S[MAX_SIZE]; // stack
push / pop / top中的

仅使用堆栈,将A[...]替换为S[...]

注意:使用pop()而不使用Top()会更优雅,让pop返回来自&#39; top&#39;堆栈

char pop();
rev()

中的

for(i=0; i<n; i++){
    A[i] = pop();
}

pop()正在

char pop() {
    if(top==-1){
       printf("Error: stack is empty\n");
       return 0;
    }
    return S[top--];
}

答案 1 :(得分:0)

因为push函数被添加到具有用户输入的同一变量

请为堆栈添加另一个变量'char A []'

进一步的解释:如果你开始倒转“你好”,推功能会用“o”代替“h”,这就是你所看到的

答案 2 :(得分:0)

问题在于你的pop函数直接访问堆栈,就像你正在读取的那个一样 所以你过早地覆盖了内容

实施例

ABC

按A,按B,按C,顶部现在为2

C  A[2]
B  A[1]
A  A[0]

然后你从0循环到2

A[0] = Top() ;   

现在你覆盖A [0]&#39; A&#39;用A [2]&#39; C&#39;但是你没有存储以前的值&#39; A&#39;

堆栈内容看起来像

A[2] C
A[1] B
A[0] C

最简单的就是拥有第二个数组

char B[MAX_SIZE]

要遍历您的堆栈,请执行以下操作

for (i = top, j = 0; i >= 0; --i)
{
  B[j++] = A[i];
}

(alt执行返回顶部值的Pop函数)

如果您只需要使用一个阵列(无论出于何种学术原因) 交换值

for (i = top, j = 0; i >= 0; --i)
{
  if (i != j)
  {
    tmp = A[j];
    A[j] = A[i];
    A[i] = tmp;
  }
}