本代码包含了顺序栈的入栈,出栈,显示剩余栈和出栈顺序四项功能
- 自定义栈容量:用户通过scanf_s输入栈的大小,但是这儿所谓的栈的大小依然在MaxSize内;
- 入栈元素:题主在网上看到的关于栈的代码,大多是用Push(S,x)函数在代码中以 Push(S,1)、Push(S,2)、Push(S,3)、Push(S,4)、Push(S,5)这种形式来给栈赋值为(1 2 3 4 5),这种方法不太灵活,题主使用for循环即可实现用户在代码运行时输入元素的值;
- 指定显示几个元素:假设一个栈为(1 2 3 4 5),用户输入3则输出前三个栈元素(1 2 3),指针位置仍指向栈顶;这个函数进行简单的修改即可实现与遍历栈元素相关的其他功能,属于一个模板;
- 出栈(先进后出):假设一个栈为(1 2 3 4 5),用户输入3则表示第3个元素及其后面的剩余元素都出栈,此时显示出栈顺序为(5 4 3),剩余栈为(1 2)。
以下为全部代码
#include <stdio.h>
#define MaxSize 50
typedef struct {
int data[MaxSize];
int Top;
}SqStack;
void InitSpStack(SqStack &S) {
S.Top = -1;
}
int Push(SqStack &S, int x) {
if (S.Top == MaxSize - 1)
{
printf("栈满");
return 0;
}
S.data[++S.Top] = x;
return 1;
}
int Pop(SqStack& S) {
if (S.Top == -1 )
{
printf("空栈");
return 0;
}
S.Top--;
return 1;
}
int Display(SqStack& S, int x) {
int i;
if (S.Top == -1 ||S.Top == 0)
{
printf("空栈\n");
return 0;
}
else
{
for (i = 0; i < x; i++)
{
printf("%d ", S.data[i]);
}
printf("\n");
return 1;
}
}
int main()
{
int A = 0;
int a=0, b=0,c=0;
SqStack S;
InitSpStack(S);
printf("请输入栈的大小:");
scanf_s("%d",&A); //判断用户输入的栈的大小是否合法
if (A > 0) { //合法继续执行
printf("请输入值(每个值需要回车确认):\n");//回车确认输入值
for (int i = 0; i < A; i++)
{
scanf_s("%d", &a); //用户输入值,此时输入的值还不是栈值
Push(S, a); //入栈,刚才输入的值此时才是栈值
}
printf("请输入要显示几个元素:");
scanf_s("%d", &b);
Display(S, b);
printf("\n");
printf("请输入第x个元素出栈(x>0):");
scanf_s("%d", &c);
printf("出栈顺序:");
for (int k = A - 1; k >= c - 1; --k)
//因为栈是先进后出,所以该循环相当于数组的逆序输出
{
printf("%d ", S.data[k]);
}
printf("\n");
for (int j = A - 1; j >= c; j--)
{
Pop(S); //直接移动S.Top指针,不用删值
}
printf("剩余栈为:");
Display(S, S.Top);
}
else printf("error"); //不合法则报错
}
结果如下:
- 当然也可以改变栈的容量,但是要在MaxSize范围内;
- 也可以改变要显示元素的个数,注意此时指针是不移动的,就是简单的进行数组遍历,只不过是题主遇到的题目有个函数要求实现该功能;
- 如果输入第1个元素出栈,则意味栈中全部元素都要出栈,即变为空栈。
改变输入后结果如下: