C //练习 4-4 在栈操作中添加几个命令,分别用在不弹出元素的情况下打印栈顶元素;复制栈顶元素;交换栈顶两个元素的值。另外增加一个命令用于清空栈。
2024-01-10 10:31:20
C程序设计语言 (第二版) 练习 4-4
练习 4-4 在栈操作中添加几个命令,分别用在不弹出元素的情况下打印栈顶元素;复制栈顶元素;交换栈顶两个元素的值。另外增加一个命令用于清空栈。
注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。
IDE工具:Visual Studio 2010
?
代码块:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100
#define BUFSIZE 100
int sp = 0;
double val[MAXVAL];
char buf[BUFSIZE];
int bufp = 0;
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;
}
}
void printTop(void){
if(sp > 0){
printf("Top: %g\n", val[sp-1]);
}
else{
printf("Error! Stack Empty!\n");
}
}
void topCopy(void){
if(sp > 0 || sp < MAXVAL){
val[sp++] = val[sp-1];
}
else if(sp <= 0){
printf("Error! Stack Empty!\n");
}
else{
printf("Error! Stack Full!\n");
}
}
void swapTop(void){
double temp;
if(sp >= 2){
temp = val[sp-1];
val[sp-1] = val[sp-2];
val[sp-2] = temp;
}
else{
printf("Can't Swap Top Number!\n");
}
}
void emptyStack(void){
for(int i = sp - 1; i >= 0; i--){
val[i] = 0;
}
sp = 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;
}
}
int getop(char s[]){
int i, c;
while((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if(c == '-'){
int next = getch();
if(!isdigit(next) && next != '.'){
ungetch(next);
return c;
}
s[1] = c = next;
i = 1;
}
else{
i = 0;
if(!isdigit(c) && c != '.'){
return c;
}
}
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;
}
int main(){
//以下注释掉计算器主函数代码
/*
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 '*':
push(pop() * pop());
break;
case '-':
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if(op2 != 0.0){
push(pop() / op2);
}
else{
printf("Error! Zero Divisor!\n");
}
break;
case '%':
op2 = pop();
push((int)pop() % (int)op2);
break;
case '\n':
printf("\t%.8g\n", pop());
break;
default:
printf("Error! Unknown Command %s\n", s);
break;
}
}
*/
//测试栈操作
for(double i = 0.0; i < 10.0; i++){
push(i);
}
printTop();
swapTop();
printTop();
topCopy();
printTop();
emptyStack();
printTop();
system("pause");
return 0;
}
文章来源:https://blog.csdn.net/navicheung/article/details/135496186
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!