简介:作者利用学习过的链表、线性表、顺序表相关知识基础和基本原理实现栈的插入删除操作
代码实现一(顺序):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX_SIZE 10
int stack[MAX_SIZE];
int top = -1;
void push(int data) {
if (top >= MAX_SIZE - 1) {
printf("栈溢出,无法插入数据\n");
}
else {
stack[++top] = data;
}
}
int pop() {
if (top == -1) {
printf("栈为空,无法删除数据\n");
return -1;
}
else {
return stack[top--];
}
}
void display() {
printf("当前栈中的元素为:\n");
for (int i = 0; i <= top; i++) {
printf("%d ", stack[i]);
}
printf("\n");
}
int main() {
int n = 0;
int flag = 1;//判断用户选择数是否合法
while (flag)
{
printf("请输入栈的一到十内的目标长度\n");
scanf("%d", &n);
if (n >= 1 && n <= 10)
{
flag = 0;
}
}
int dight = 0;
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素的值:\n", i + 1);
scanf("%d", &dight);
push(dight);
}
display();//显示刚刚压入的栈
int flags = 1;
while (flags)
{
int choice = 1;
int sth = 0;
printf("-------------------------------------------------------\n");
printf("请选择你想要的执行的操作:1.压入栈 2.弹出栈 0.退出\n");
printf("-------------------------------------------------------\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入待压入的元素:\n");
scanf("%d", &sth);
push(sth);
display();
break;
case 2:
pop();
display();
break;
case 0:
flags = 0;
break;
default:
printf("请输入有效值!\n");
break;
}
}
return 0;
}
代码实现二(指针):
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define NULL 0
struct node//定义节点
{
int data;//数据域
struct node *next;//链接指针域
}*p; *top;//指向节点的指针指向栈栈顶的指针
//显示堆栈
void disp()
{
if (top == NULL) {//空表
printf("\n堆栈已为空!\n");
return;
}
int i = 1;
p = top;//从顶开始
do
{
printf("\n(%d)=%3d", i, p->data);//显示一个节点数据
p = p->next;//指向下一个节点
i++;
} while (p!=NULL);//直到栈底
printf("\n");
}
//栈的线性链表的压入算法
void pushnode(int x) {
p = (struct node*)malloc(sizeof(struct node));//申请一个新节点
p->next = top;
p->data = x;
top = p;
disp();
}
//栈的线性链表的弹出算法
int popnode() {
int x;
p = top;//指向栈顶
x = p->data;//取值
top = p->next;//调整栈顶
free(p);
disp();
return x;
}
int main() {
int n = 0;
int flag = 1;//判断用户选择数是否合法
while (flag)
{
printf("请输入栈的一到十内的目标长度\n");
scanf("%d", &n);
if (n >= 1 && n <= 10)
{
flag = 0;
}
}
int dight = 0;
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素的值:\n", i + 1);
scanf("%d", &dight);
pushnode(dight);
}
int flags = 1;
while (flags)
{
int choice = 1;
int sth = 0;
printf("-------------------------------------------------------\n");
printf("请选择你想要的执行的操作:1.压入栈 2.弹出栈 0.退出\n");
printf("-------------------------------------------------------\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入待压入的元素:\n");
scanf("%d", &sth);
pushnode(sth);
break;
case 2:
popnode();
break;
case 0:
flags = 0;
break;
default:
printf("请输入有效值!\n");
break;
}
}
return 0;
}
运行结果一(顺序):
运行结果二(指针):