所以我正在编写一个代码来使用堆栈反转字符串,但输出总是
似乎错了,任何人都可以告诉我们这个问题是什么?!
当我写一个像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");
}
这是屏幕截图中的输出
答案 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;
}
}