基于C语言堆栈push,pop,destroystack,isEmpty,isFull实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于C语言堆栈push,pop,destroystack,isEmpty,isFull实现相关的知识,希望对你有一定的参考价值。

参考技术A 以下代码是基于C语言写的堆栈的压栈,出栈,清栈,读栈指针等方法,在Visual studio 中,可直接使用,供学习者参考学习。

#include

#include

#include

#include

#include

#include

#define MAX_SIZE 100

typedef struct Stack



char *data;

int size;

int top;

;

void initStack(Stack *s); //init stack

void destroyStack(Stack *s);

bool push(Stack *s,char ch);

char pop(Stack *s);

char gettop(Stack *s);

bool isEmpty(Stack *s);

bool isFull(Stack *s);

void setNull(Stack *s);

#endif

void initStack(Stack *s)



s->data = (char*)malloc(MAX_SIZE * sizeof(char)); //分配最大内存空间

if (!s->data)

exit(OVERFLOW); //提前终止程序

s->size = MAX_SIZE;

s->top = -1;



void destroyStack(Stack *s)



free(s->data);



bool push(Stack *s, char ch)



if ((s->top + 1) != s->size)



s->data[++s->top] = ch;

return true;



else

return false;



char pop(Stack *s)



if (s->top != -1)

return s->data[s->top--];



char gettop(Stack *s)



return s->data[s->top];



bool isEmpty(Stack *s)



if (s->top == -1)

return true;

else

return false;



bool isFull(Stack *s)



if ((s->top + 1) == s->size)

return true;

else

return false;



void setNull(Stack *s)



s->top = -1;



int main()



char chd;

bool c;

Stack s1;

initStack(&s1);

c = push(&s1, 'a');

printf("Stack s1 push status is %d,s.data is %c,top value is %d ", c,s1.data[s1.top],s1.top);

c = push(&s1, 'b');

printf("Stack s1 push status is %d,s.data is %c,top value is %d ", c, s1.data[s1.top], s1.top);

chd = gettop(&s1);

printf("Stack s1->top data:%c,top value is %d ", chd, s1.top);

chd = pop(&s1);

printf("Stack 弹出 data:%c,top value is %d ", chd, s1.top);

chd = pop(&s1);

printf("Stack 弹出 data:%c,top value is %d ", chd, s1.top);

c = isEmpty(&s1);

printf("Stack s1 c bool:%d,top value is %d ", c, s1.top);

c = isFull(&s1);

printf("Stack s1 c bool:%d,top value is %d ", c, s1.top);

return 0;

1403 有趣的堆栈

1403 有趣的堆栈

基准时间限制:1 秒 空间限制:131072 KB 分值
大家都熟悉堆栈操作。一个堆栈一般有两种操作,push和pop。假设所有操作都是合法的并且最终堆栈为空。我们可以有很多方法记录堆栈的操作,
(1) 对每个pop操作,我们记录它之前一共有多少个push操作。
(2) 对每个pop操作,我们记录这个被Pop的元素曾经被压上了几个。
例如:操作push, push, pop, push, push, pop, push, pop, pop, pop
用第一种方法 记录为 2, 4, 5, 5, 5
用第二种方法 记录为 0, 0, 0, 2, 4
这两种记录方法可以互相转化,我们的问题是,给定第二种记录方法的序列,请求出第一种记录方法的序列。
 
Input
第一行一个整数n,表示序列的长度(0 < n <=1000000)
第二行n个整数,表示第二种方法的记录。
Output
一行,空格分隔的n个整数,表示第一种表示方法的序列。
Input示例
5
0 0 0 2 4
Output示例
2 4 5 5 5
思路:将序列看成括号匹配;当前最末的肯定是),也就是出栈,那么在这个出栈前有4对括号完整匹配,那么对应这个入栈是在i-2*ans[i]-1,的位置,
那么每次你碰到的未操作的都是),然后每次像上面一样去找入栈点就可以了复杂度O(n);
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<stdlib.h>
 6 #include<queue>
 7 #include<set>
 8 #include<vector>
 9 #include<map>
10 using namespace std;
11 typedef long long LL;
12 int str[1000005];
13 int str1[2*1000005];
14 int cnt[1000005];
15 inline bool scan_d(int &num)  
16 {
17         char in;bool IsN=false;
18         in=getchar();
19         if(in==EOF) return false;
20         while(in!=-&&(in<0||in>9)) in=getchar();
21         if(in==-)
22   {
23    IsN=true;num=0;
24   }
25         else num=in-0;
26         while(in=getchar(),in>=0&&in<=9)
27   {
28                 num*=10,num+=in-0;
29         }
30         if(IsN) num=-num;
31         return true;
32 }
33 int main(void)
34 {
35         int n;
36         while(scanf("%d",&n)!=EOF)
37         {
38                 int i,j;
39                 memset(str1,-1,sizeof(str1));
40                 for(i = 1; i <= n; i++)
41                 {
42                         scanf("%d",&str[i]);
43                 }
44                 int u = n;
45                 for(i = 2*n; i >= 1; i--)
46                 {
47                         if(str1[i]==-1)
48                         {
49                                 str1[i] = 0;
50                                 str1[i-2*str[u]-1] = 1;
51                                 u--;
52                         }
53                 }int ac = 0;
54                 int k = 1;
55                 for(i = 1;i <= 2*n;i++)
56                 {
57                     if(str1[i]==1)
58                     {
59                         u++;
60                     }
61                     else
62                     {
63                         cnt[k++] = u;
64                     }
65                 }
66                 printf("%d",cnt[1]);
67                 for(i = 2;i <= n;i++)
68                 {
69                     printf(" %d",cnt[i]);
70                 }
71                 printf("\n");
72         }return 0;
73 }

 


以上是关于基于C语言堆栈push,pop,destroystack,isEmpty,isFull实现的主要内容,如果未能解决你的问题,请参考以下文章

C语言 push和pop函数可以直接用吗?

汇编语言通用数据处理指令——堆栈传送指令

汇编语言通用数据处理指令——堆栈传送指令

1403 有趣的堆栈

堆栈 - 为啥是 PUSH 和 POP?

c语言中(不是C++)具体实现堆栈代码,后进先出原理我懂!