从一个字符串推送,弹出和显示函数到堆栈

时间:2016-06-03 17:17:55

标签: c string stack push pop

我试图编写一个用户引入数组编号和字母字符的程序。然后程序读取数组,如果他看到一个数字,程序应该将该数字推入一个堆栈。但是,如果他看到一个按字母顺序排列的字符,则弹出最后一个推送的数字。

到目前为止,我有这段代码:

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

#define MAX 20

int top, i;
void push (double stack[], double x, int top)
{
stack[top] = x;
}
 int pop (double stack[])
{
    double x;
    stack [top]=x;
    return x;
}

void display (double stack[],int top)
{
    int i;
    printf ("\n The stack is: ");
        for (i=0; i<=top; i++)
         {
           printf ("%lf\n",stack[i]);
     }
}

void main()
{
int r;
int stack[10];
char array[10];
printf("introduce the numbers");
fgets(array,MAX,stdin);
int l;
r=strlen(array);
top=0;
for (l=0;l<=r;l++)
{
int n;
if (isdigit(array[l]))
 {
    push(stack,array[l],top);
    top=top+1;
 }

 if (islower(array[l]))
 {
        pop(stack);
        printf("you have popped %d", n);
        top=top-1;
 }
}
 display(stack,top);
}

由于某种原因,程序不起作用,如果我引入22a输出是:
you have popped 4194432 The stack is: 50.00000 50.00000

我特别感兴趣的是如何编写pop,push和display以使该程序正常工作。我该怎么办?

谢谢

我在C编程

1 个答案:

答案 0 :(得分:3)

首先,您正在打印的值n未初始化,并且包含创建时内存中的任何垃圾。

另外,你为什么打印它?我想你想说n = pop(stack);,对吗?否则这种打印是没用的。

在整个代码中,您编写的循环方式错误:for (t=0; t<=threshold; t++)。此代码将使循环运行threshold + 1次,但您显然只需要threshold,所以请改为for (t=0; t<threshold; t++)

您还在fgets(array,MAX,stdin);中阅读(array最多二十个字符,这些字符只能容纳十个字符。

要在数组上使用strlen,您需要以零(null-terminator)结束。在您的代码中array未必使用零初始化,因此在使用memset(array, 0, 10);之前请使用array

  1. Docs on memset
  2. Tutorial on for loops
  3. void main() is wrong
  4. What to read to learn C