C语言、定义一个字符型链栈(使用Visual C++6.0编写)

定义一个字符型链栈。

  1. 编写以下操作函数       
  2. 初始化栈:函数名InitLinkStack();
  3.            判别栈空:函数名IsEmptyStack();
  4.            进栈:函数名Push();
  5.            出栈:函数名Pop;
  6.            显示栈顶元素值:函数名DispStackTop();
  7.            编写主函数:显示菜单,并可根据菜单命令调用相应操作函数。
  1. 要求:
  2.           不允许使用typedef char Datatype语句定义类型,即程序中不能出现Datatype。
  3.           函数名只能使用已给定函数名。
  4.           程序编译通过,给出操作结果。

提示:

  1. C语言是面向过程的,所以函数的作用域(可被调用的范围)从函数到程序的末尾。如果要在整个程序中都可调用某个函数,只需进行 函数声明(函数方法头加上符号“;”。形式参数可省略);
  2. 对于指针(地址)变量,可通过(类型 *)malloc(sizeof(类型))函数分配一个地址,sizeof(类型)返回类型所需的大小;
  3. 可用free(指针变量)函数释放指针变量指向的地址空间;
  4. 栈是一种操作受限的线性表,特点是“后进先出”。但可分多种情况,例如:ABCD顺序进入的栈,有全进后再出的情况,有进三个后再出的情况,有进两个后再出的情况,有进一个后再出的情况。区分方法是:全进时先出的是最后一个元素,进三个时先出的是第三个元素,以此类推。
  5. 栈的入栈方法有两种:头插法(后进先出)和尾插法(先进先出)。本程序用的是头插法;

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

struct LinkStack{
	char c;
	struct LinkStack *next;
};

LinkStack *InitLinkStack();
int IsEmptyStack(struct LinkStack *stack);
void Push(struct LinkStack *stack);
void Pop(struct LinkStack *stack);
void DispStackTop(struct LinkStack *stack);
void PrintIsEmptyStack(struct LinkStack *stack);
void PrintStack(struct LinkStack *stack);

void menu(){
	printf("\n         链栈的各种操作");
	printf("\n==================================");
	printf("\n|         1--初始化栈            |");
	printf("\n|         2--判断栈空            |");
	printf("\n|         3--入栈                |");
	printf("\n|         4--出栈                |");
	printf("\n|         5--得到栈顶元素         |");
	printf("\n|         6--输出栈              |");
	printf("\n|         0--退出                |");
	printf("\n==================================");
	printf("\n输入选择(0~6):");
}

//初始化栈
LinkStack *InitLinkStack(){
	struct LinkStack *stack;        //使用malloc()函数动态分配存储空间
	stack = (struct LinkStack *)malloc(sizeof(struct LinkStack));
	stack->next = NULL;

	printf("初始化栈成功\n");
	return stack;
}

//判断栈是否空
int IsEmptyStack(struct LinkStack *stack){
	if(stack->next == NULL)
		return 1;    //如果栈空,返回1,否则返回0
	else
		return 0;
}

//入栈操作
void Push(struct LinkStack *stack){
	char ch;
	struct LinkStack *s;

	printf("输入要入栈的字符:");
	ch = getchar();
	getchar();    //吸收换行符,防止出现错误

	s = (struct LinkStack *)malloc(sizeof(struct LinkStack));
	s->c = ch;    //把字符ch赋给结构体s的变量c
	s->next = stack->next;    //使新结点的指针指向头结点的指针
	stack->next = s;    //使头结点的指针指向新结点s
}

//出栈操作
void Pop(struct LinkStack *stack){
	struct LinkStack *s;
	char ch;

	if(stack->next == NULL){    
		printf("当前栈已空,无法出栈!\n");
		exit(1);
	}

	s = stack->next;    //s指向头结点的指针
	ch = s->c;          //s的,也就是原头结点指针的变量c赋给ch
	stack->next = s->next;    //头结点指向自己之后的一个结点
	free(s);        //释放指针变量s指向的地址空间

	printf("出栈成功,出栈元素为%2c\n",ch);
}

//得到栈顶元素
void DispStackTop(struct LinkStack *stack){
	printf("当前栈顶元素为%2c\n",stack->next->c);
}

//输出栈是否为空
void PrintIsEmptyStack(struct LinkStack *stack){
	if(IsEmptyStack(stack)) 
		 printf("当前栈为空\n");	
	else
	     printf("当前栈不为空\n");
}

//输出栈
void PrintStack(struct LinkStack *stack){
	struct LinkStack *s = stack->next;

	printf("当前栈为:\n");
	while(s != NULL){
		printf("%3c",s->c);
		s = s->next;    
	}
	putchar('\n');
}

void main(){
	struct LinkStack *stack;
	char char1 = 'y',char2;

	do{
		menu();
		char2 = getchar();
		getchar();

		while(char1 == 'y' || char1 == 'Y'){
				switch(char2){
				case '1': stack = InitLinkStack();break;
				case '2': PrintIsEmptyStack(stack);break;
				case '3': Push(stack);break;
				case '4': Pop(stack);break;
				case '5': DispStackTop(stack);break;
				case '6': PrintStack(stack);break;
				case '0': char1 = 'n';break;
				default:printf("选择有误,范围应为0~6!\n");
			}
			
			char1 = 'n';
			if(char2=='3' || char2=='4'){
				printf("是否继续(y/n):");
				char1 = getchar();
				getchar();
			}
		}

		char1 = 'y';
		if(char2 != '0'){
			printf("按回车键继续,按任意键退出...");
			char2 = getchar();
			if(char2 != '\n'){
				getchar();
				char1 = 'n';
			}
		}else
			char1 = 'n';
	}while(char1 == 'Y' || char1 == 'y');

	printf("\n操作结束\n");
	system("pause");    //输出程序末尾出现的英文的中文翻译
}


 

 

 

 

 

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值