C程序设计语言(第二版) 4-4 栈操作添加复制、打印栈顶元素,交换栈顶元素等...

#include<stdlib.h> 
#include<stdio.h> 
#include<ctype.h> 
#include<math.h> 
 
#define MAXOP 100 
#define NUMBER  0 
#define TRUE 1 
#define FALSE 0 

int Getop(char s[]); 
void push(double val); 
double pop(void); 
void showTop(void); 
void duplicate(void); 
void swapItems(void); 
void clearStack(); 
 
int main(void) 
{ 
    int type; 
    double op2; 
    char s[MAXOP]; 
    int flag = TRUE; 
 
    while((type = Getop(s)) != EOF) 
    { 
        switch(type) 
        { 
            case NUMBER: 
                push(atof(s)); 
                break; 
            case '+': 
                push(pop() + pop()); 
				      break; 
            case '*': 
                push(pop() * pop()); 
                break; 
            case '-': 
                op2 = pop(); 
                push(pop()- op2); 
                break; 
            case '/': 
                op2 = pop(); 
                if(op2) 
                    push(pop() / op2); 
                else 
                    printf("\nError: division by zero!"); 
                break; 
            case '%': 
                op2 = pop(); 
                if(op2) 
                    push(fmod(pop(), op2)); 
                else 
                    printf("\nError: division by zero!"); 
                break; 
            case '?': 
                showTop(); 
                break; 
            case '#': 
                duplicate(); 
                break; 
            case '~': 
                swapItems(); 
                break; 
            case '!': 
                clearStack(); 
            case '\n': 
                printf("\n\t%.8g\n", pop()); 
                break; 
            default: 
                printf("\nError: unknown command %s.\n", s); 
                break; 
        } 
    } 
    return EXIT_SUCCESS; 
}    

#define MAXVAL 100 
 
int sp = 0;          /* Next free stack position. */ 
double val[MAXVAL];  /* value stack. */ 
 
/* push: push f onto stack. */ 
void push(double f) 
{ 
    if(sp < MAXVAL) 
        val[sp++] = f; 
    else 
         printf("\nError: stack full can't push %g\n", f); 
} 
 
/*pop: pop and return top value from stack.*/ 
double pop(void) 
{ 
    if(sp > 0) 
        return val[--sp]; 
    else 
    { 
        printf("\nError: stack empty\n"); 
        return 0.0; 
    } 
} 
 
void showTop(void) //?
{ 
	double top=val[sp];
	
	printf("%u\n",top);
} 
 
 
void duplicate(void) //#
{ 
	int top=sp-1;
	double topVal;
	topVal=val[top];
	val[top+1]=topVal;
	sp++;
} 

void swapItems(void) //~
{ 
	double temp;
	int top= sp;
	int secTop = sp-1;
	temp = val[top];
	val[top]=val[secTop];
	val[secTop]=temp;


} 
 
/* pop only returns a value if sp is greater than zero. So setting the 
stack pointer to zero will cause pop to return its error */ 
 
void clearStack(void) //!
{ 
	sp=0;
} 
 
int getch(void); 
void unGetch(int); 
 
/* Getop: get next operator or numeric operand. */ 
int Getop(char s[]) 
{ 
    int i = 0; 
    int c; 
    int next; 
 
    /* Skip whitespace */ 
    while((s[0] = c = getch()) == ' ' || c == '\t') 
        ; 
    s[1] = '\0'; 
 
    /* Not a number but may contain a unary minus. */ 
    if(!isdigit(c) && c != '.' && c != '-') 
        return c;                
 
    if(c == '-') 
    { 
        next = getch(); 
        if(!isdigit(next) && next != '.') 
        { 
           return c; 
        } 
        c = next; 
    } 
	   else 
        c = getch(); 
  
    while(isdigit(s[++i] = c)) 
		c = getch(); 
    if(c == '.')                        /* Collect fraction part. */ 
        while(isdigit(s[++i] = c = getch())) 
                        ; 
    s[i] = '\0'; 
    if(c != EOF) 
        unGetch(c); 
    return NUMBER; 
} 
 
#define BUFSIZE 100 
 
char buf[BUFSIZE]; 
int bufp = 0; 
 
/* Getch: get a ( possibly pushed back) character. */ 
int getch(void) 
{ 
     return (bufp > 0) ? buf[--bufp]: getchar(); 
} 
 
/* unGetch: push character back on input. */ 
void unGetch(int c) 
{ 
    if(bufp >= BUFSIZE) 
        printf("\nUnGetch: too many characters\n"); 
    else 
        buf[bufp++] = c; 
}  

 

【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值