K&R的名著:<C程序设计语言>小程序总结2

1、push函数:把f压入到值栈中

#define MAXVAL 100

int sp = 0;
double val[MAXVAL];

void push(void)
{
    if (sp < MAXVAL)
       val[sp++] = f;
    else
       printf("error: stack full, can't push %g\n",f);

}

2、pop函数:弹出并返回栈顶的值

double pop(void)
{
    if (sp > 0)
          return val[--sp];
    else  {
         printf("error: stack empty!\n");
         return 0.0;
  }

}

3、简易计算器(逆波兰表示法)

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

#define MAXOP 100
#define NUMBER '0'

int getop(char []);
void push(double);
double pop(void);

int main(void)
{
  int type;
  double op2;
  char s[MAXOP];
  
  while ((type = getop(s)) != EOF) {
    switch (type) {
      case NUMBER:
	push(atof(s));
        break;
      case '+':
	push(pop() + pop());
	break;
      case '-':
	op2 = pop();
	push(pop()- op2);
	break;
      case '*':
	push(pop() * pop());
	break;
      case '/':
	op2 = pop();
	if (op2 != 0.0)
	  push(pop() / op2);
	else
	  printf("error: zero divisor\n");
	break;
      case '\n':
	printf("\t%.8g\n",pop());
      default:
	printf("error: unknown command %s\n",s);
	break;
      
    }
    
  }
  return 0;
  
}

#define MAXVAL 100

int sp = 0;
double val[MAXVAL];
void push(double f)
{
  if (sp < MAXVAL)
    val[sp++] = f;
  else
    printf("error: stack full, can't push %g\n", f);  
}

double pop(void)\
{
  if (sp > 0)
    return val[--sp];
  else 
  {
    printf("error: stack empty!\n");
    return 0.0;
  }
  
}

#include<ctype.h>

int getch(void);
void ungetch(int);

int getop(char s[])
{
  int i, c;
  while ((s[0] = c = getch()) == ' ' || c == '\t')
    ;
  s[1] ='\0';
  if (!isdigit(c) && c!='.')
    return c;
  i = 0;
  if (isdigit(c))
    while (isdigit(s[++i]) = c = getch())
      ;
    if (c == '.')
      while (isdigit(s[++i] = c =getch()))
	;
      s[i] ='\0';
    if (c != EOF)
      ungetch(c);
    return NUMBER;
  
}

#define BUFSIZE 100
charbuf[BUFSIZE];
int bufp = 0;

int getch(void)
{
  return (bufp > 0 ? buf[--bufp] : getchar());
}

void ungetch(int c)
{
  if (bufp >= BUFSIZE)
    printf("ungetch: too many characters\n");
  else
    buf[bufp++] = c;
}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值