main함수에 선언한 s가 int[] 형인데, getop에서 사용하는 s는 char[]형인요.
그리고 현재 getop로 읽었을 때 가장 먼저 들어오는 글자는 '\n'입니다.
현재 scanf로는 z 538의 538까지만 읽었고, 그 뒤의 '\n'는 읽지 않은 상황이라서 커서는 538'\n' 의 \n 앞에 위치하게 됩니다. 따라서 일단 깔끔하게 error: stack empty\n 부터 출력하고 시작하겠네요.
무한루프를 도는 직접적인 원인은
if (97<=c||c<=122) s[i++] = si[c-97];
이 부분 입니다.s에는 분명 문자열이 저장되어야할텐데 (atof를 사용하셨으니까) 지금 si에 있는 double형 숫자를 문자열에 집어넣고 있습니다. s[0]=538; 같은 짓을 하고있는거죠. s는 char형인데..s[0]=5, s[1]=3, s[2]=8; 이게 원래 의도했던 동작 아닐까요?