2016-06-03 1 views
0

Я пытаюсь написать программу, в которой пользователь вводит номера массивов и алфавитные символы. Затем программа считывает массив, если он видит номер, программа должна подталкивать это число в один стек. Однако, если он видит алфавитный символ, последний нажатый номер выскочит.Функции push, pop и display из одной строки в стек

До сих пор у меня есть этот код:

#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

Вы читаете двадцать символов '# определите MAX 20' в массив размера 10. Кроме того, в вашем цикле у вас есть 'for (l = 0; l <= r; l ++)', что может привести к тому, что i n segfault, когда вы попытаетесь получить доступ к 'stack [l]' if 'l == r'. – ForceBru

+0

Более того, вы вызываете 'pop (stack)' и _not с использованием значения return_ (!), Поэтому почему вы думаете, что неинициализированная переменная 'n' будет содержать какое-то полезное значение? – ForceBru

+0

Всякий раз, когда вы зацикливаете, вы выполняете 'for (i = 0; i <= threshold; i ++)', что не имеет смысла: вы пытаетесь получить значения 'treshold + 1' из массива, в то время как вы определенно хотят только «перехватить» их. – ForceBru

ответ

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 на массиве, вам нужно, чтобы оно закончилось нулем (нулевой ограничитель). В вашем коде 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