堆栈模拟AnalogStack

题目要求

涉及知识点:内存管理、结构体定义、基本数据结构
要求:编写一个程序模拟堆栈,要求能够模拟、入栈、出栈、返回栈顶元素等基本操作。栈中元素可用整数代替。不能使用C++模板库预定义的类型。程序运行中可输入多组入栈、出栈操作,每次操作后展示栈中元素。

题目分析

栈的基本概念

栈的基本概念

栈的常用运算

在这里插入图片描述

栈的存储结构

在这里插入图片描述

顺序栈的定义

在这里插入图片描述

栈运算的实现

在这里插入图片描述
在这里插入图片描述

代码实现

方法一:直接使用数组来进行模拟(较为简单,不需要数据结构知识也可以做)
方法二:使用链表进行模拟操作(需要提前了解链表等知识,需要一定数据结构的基础)

接下来直接贴代码啦!

//方法一 数组
#include<stdio.h>
int push(int *stack,int *toppointer,int x,int length){
	//分别为指向用于模拟栈的数组的指针,指向栈顶的指针,入栈的元素,栈的长度 
	if(*toppointer>=length){
	 	printf("栈满\n");
	 	return 1;
	}//超过了栈的长度 
	
	stack[*toppointer]=x;//把x作为栈顶元素 
	(*toppointer)++;
	return 0;
}//入栈函数 

int pop(int *stack,int *toppointer){
	if(*toppointer==0){//指针指向0,为空栈,不能出栈
		printf("空栈,无法出栈\n");
		return 1; 
	}
	(*toppointer)--;
	return 0;
}//出栈函数 

int showStack(int *stack,int toppointer){
	int i=toppointer-1;
	while(i>=0) printf("%d ",stack[i--]);
	return 0;
}//自栈顶向下输出栈中元素 

int showTop(int *stack,int toppointer){
	if(toppointer==0) printf("空栈,没有栈顶元素"); 
	else printf("%d",stack[toppointer-1]);
	return 0;
}

int main(){	
	printf("创建空栈?是:1,否:2\n");
	int n;scanf("%d",&n);
	while(n!=1&&n!=2){
		printf("输入错误,请重新输入:");
		scanf("%d",&n);	 
	}
	int length;//栈的长度
	if(n==2) return 0;
	else{
		printf("请输入栈的长度:");
		scanf("%d",&length);
		printf("创建成功!\n"); 
	}//创建空栈,用户对栈的长度进行初始化 
	
	int stack[length];//用于模拟栈的数组
	int in;//入栈元素
	int top=0;//栈顶 
	int choice=0;//操作选择
	
	while(1){
		printf("-------------\n");//每次操作分割线,便于阅读 
		printf("请进行选择,1:入栈,2:出栈,3:退出程序,4:显示栈顶元素\n");
		scanf("%d",&choice);//输入用户的选择 
		
		if(choice==3) return 0; //3.退出程序
		
		else if(choice==1){ 
			printf("请输入进栈元素:  ");
			scanf("%d",&in);//输入入栈元素 
			if(push(stack,&top,in,length)==0){//如果栈未满 
				printf("栈内元素为:");
				showStack(stack,top);//输出栈内元素 
				printf("\n");
			}
		}//1.入栈
		
		else if(choice==2){
			if(pop(stack,&top)==0){//如果栈内不为空
				printf("出栈元素为:%d",stack[top]);//输出出栈元素 
				printf("\n");
				printf("栈内元素为:");
				showStack(stack,top);//输出出栈后当前栈内元素 
				printf("\n");
			}
		}//2.出栈(只能删除栈顶的元素) 
		
		else if(choice==4){
			showTop(stack,top);
			printf("\n");
		}//4.显示栈顶元素
		
		else printf("输入错误,请检查并重新输入\n"); //未选择1 2 3 4,错误输入
	}
	return 0;
}
//方法二 链表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
# define maxn 20

struct Node {
	int val;
	struct Node *next = NULL;
};

//创建链表
struct Node *createList() {
	struct Node *headNode = (struct Node *)malloc(sizeof(struct Node));
	headNode->next = NULL;
	return headNode;
}

//创建结点
struct Node *creatNode(int val) {
	struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
	newNode->val = val;
	newNode->next = NULL;
	return newNode;
}

//入栈
void push(struct Node *headNode, int val) {
	struct Node *newNode = creatNode(val);
	newNode->next = headNode->next;
	headNode->next = newNode;
}

//出栈
void pop(struct Node *headNode) {
	headNode->next = headNode->next->next;
}

//打印
void printfList(struct Node *headNode) {
	struct Node *pMove = headNode->next;
	printf("your List:");
	while (pMove) {
		printf("%d ", pMove->val);
		pMove = pMove->next;
	}
	printf("\n");
}

int main() {
	struct Node *list = createList();
	printf("1:入栈,2:出栈,3:返回栈顶元素,4:结束程序。\n");
	char s[maxn] = {0};
	char end[maxn] = "4";
	while (1) {
		printf("---------\n请选择:"); 
		scanf("%s", s);
		if (s[0] == '1') {
			printf("请输入数据:");
			int r = 0;
			scanf("%d", &r);
			push(list, r);
			printfList(list);
		} else if (s[0] == '2') {
			if (list->next == NULL) {
				printf("空栈,不能出栈\n");
				continue;
			}
			pop(list);
			printfList(list);
		} else if (s[0] == '3') {
			if (list->next == NULL) {
				printf("空栈,没有栈顶元素\n");
			} else {
				printf("栈顶元素:%d \n", list->next->val);
				printfList(list);
			}
		} else if (strcmp(s, end) == 0) {
			printf("See you!");
			break;
		}
	}
	return 0;
}

果然是写代码的时候要多写注释,不然可能会出现以下两种情况:

  1. 自己看不懂自己的代码了
  2. 别人看不懂自己的代码

虽然这个程序才写过没多久,但是我就好像脑子空空那个猪…已经忘却了…
我相信点开这篇文章的同学们一定比我脑子聪明,能看懂的!!!

…Ending…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值