题目要求
涉及知识点:内存管理、结构体定义、基本数据结构
要求:编写一个程序模拟堆栈,要求能够模拟、入栈、出栈、返回栈顶元素等基本操作。栈中元素可用整数代替。不能使用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;
}
果然是写代码的时候要多写注释,不然可能会出现以下两种情况:
- 自己看不懂自己的代码了
- 别人看不懂自己的代码
虽然这个程序才写过没多久,但是我就好像脑子空空那个猪…已经忘却了…
我相信点开这篇文章的同学们一定比我脑子聪明,能看懂的!!!
…Ending…