题目:
思路:链式栈的实现要注意,一定要区分好栈顶元素在头上,栈底在尾。头结点是栈顶元素,插入数据的时候需要去破坏头结点。
代码:
#include<iostream>
using namespace std;
typedef struct Stack
{
int data;
struct Stack* next;
}ST;//链表结构体的创建
void StackInit(ST** ps)
{
(*ps) = (ST*)malloc(sizeof(ST));
(*ps)->next = NULL;
}//链表的初始化
void StackCreate(ST** ps, int n)
{
int x = 0;
ST* cur = *ps;
while (n)
{
cin >> x;
ST* newnode = (ST*)malloc(sizeof(ST));
newnode->data = x;
newnode->next = cur->next;//这一步很关键,把cur的next赋值给newnode的next
//无论cur的next后面有几个元素都直接拦截在newnode后面就可以
cur->next = newnode;//最后再把newnode链接在cur后面
n--;
}
}
bool IsStackEmpty(ST** ps)
{
if ((*ps)->next == NULL)//哨兵位头结点的下一个指向NULL即为空
return true;
else
return false;
}
void StackPop(ST** ps)
{
if (IsStackEmpty(ps))//如果为空则返回
return;
else
{
ST* cur = (*ps)->next;
ST* rear = cur->next;
free(cur);
(*ps)->next = rear;
}
}
int StackTop(ST** ps)
{
return (*ps)->next->data;
}
int main()
{
ST* p;
StackInit(&p);
int n = 0;
cin >> n;
StackCreate(&p, n);
int k = 0;
cin >> k;
while (k)
{
StackPop(&p);
k--;
}
if (IsStackEmpty(&p))
printf("-1");
else
printf("%d", StackTop(&p));
return 0;
}