1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#includeusing namespace std;
/*顺序栈*/
#define  MAXSIZE 100
/*如果是顺序栈,栈顶和栈底指针也可以用int型,通过下标定位*/
typedef struct 
{
    SElemType *base;//栈底指针 
    SElemType *top;//栈顶指针
    int StackSize; //栈的容量 
 }SqStack;
int InitStack(SqStack &S)
{
    S.base=new SElemType[MAXSIZE];//从栈底开始找,让其从栈顶出去
    if(!S.base)
    return 0;
    S.top=S.base;//初始化为空栈
    S.StackSize=MAXSIZE;//初始化栈容量 
    return 0; 
}
/*入栈*/
int Push(SqStack &S,int e)
{
    if(S.top-S.base==S.StackSize)//不确定这块指针相减的结果是否正确
    return 0;//栈满退出
    *S.top++=e;//从栈顶压入元素,移动栈顶指针 
    return 0; 
 
/*出栈*/
int Pop(SqStack &S,int &e)
{
    if(S.top==S.base)
    return 0;//栈空
    e=*--S.top;//进出栈都为栈顶
    return 0; 
 
/*取栈顶元素*///栈不删除元素 
int GetTop(SqStack &S)
{
    if(S.top==S.base)//栈非空
    return *(S.top-1); 
 
  
  
/*链栈*/
typedef struct StackNode
{
    int elem;
    struct StackNode *next;
 }StackNode,*LinkStack;//类似于链表的创建//其实就是链表完成另一种使用规则
 /*初始化栈链*/ 
int InitStack(LinkStack &S)//但是链栈的初始化只是构造一个空栈,不用设置头结点
{    S=NULL;
return 0;
    
 
 /*入栈*/
int Push(LinkStack &S,int e)
{
    StackNode *p;//结点指针 
    p=new StackNode;//申请空间 
    p->elem=e;//赋值 
    p->next=S;//前插,但是是以倒着看的S为栈底 
    S=p;//将p的位置看做栈顶
    return 0; 
 }
 /*出栈*/
 int Pop(LinkStack &S,int &e)
 {
   e=S->elem;
   StackNode *p;
   p=S;//p临时保存栈顶元素,以备释放 
   S=S->next;//因为为前插,所以之前结点在指针位置的后面
     delete p;
     return 0;
  
/*取栈顶元素*/
int GetTop(LinkStack S)//INT 为要返回的元素的值的类型 
{
    if(S!=NULL)
    return S->elem;
 }


点赞(0)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论