• 栈的运行算法


    一,顺序栈的静态分配

    二,顺序栈的动态分配

    2.1结构体

    1. typedef struct Sqstack{
    2. int *base;
    3. int *top;
    4. int stacksize;
    5. }Sqstack;

    2.2初始化

    1. void InitStack(Sqstack *s){
    2. (*s).base=(int *)malloc(initsize*sizeof(int));
    3. if(!(*s).base)exit(0);
    4. (*s).top=(*s).base;
    5. (*s).stacksize=initsize;
    6. }

    2.3入栈

    1. void Push(Sqstack *s,int e){
    2. if((*s).top-(*s).base >= (*s).stacksize){
    3. (*s).base=(int*)realloc((*s).base,((*s).stacksize+incresize)*sizeof(int));
    4. if(!(*s).base)exit(0);
    5. (*s).top=(*s).base+(*s).stacksize;
    6. (*s).stacksize+=incresize;
    7. }
    8. *((*s).top)=e;
    9. (*s).top++;
    10. }

    2.4出栈

    1. void Pop(Sqstack *s,int *e){
    2. if((*s).top==(*s).base) exit(0);
    3. (*s).top--;
    4. *e=*((*s).top);
    5. }

    2.5销毁栈

    1. void Destroystack(Sqstack *s){
    2. if(s!=NULL){
    3. free((*s).base);
    4. (*s).base=NULL; (*s).top=NULL;
    5. (*s).stacksize=0;
    6. }
    7. }

    2.6栈判空

    1. int StackEmpty(Sqstack s){
    2. return (s.top==s.base);
    3. }

    2.7求栈长

    1. int StackLength(Sqstack s){
    2. return s.top-s.base;
    3. }

      2.8 主函数

    1. #include
    2. #include
    3. #define initsize 5
    4. #define incresize 5
    5. int main(){
    6. Sqstack s;
    7. InitStack(&s);
    8. int e,p,x;
    9. for(int j=0;j
    10. scanf("%d",&e);
    11. Push(&s,e);
    12. }
    13. GetTop(s,&p);
    14. printf("栈顶元素是%d ",p);
    15. if(StackEmpty(s)) printf("\n非空!");
    16. else ("\n empty!");
    17. int length=StackLength(s);
    18. printf("\n 栈长为%d",length);
    19. Pop(&s,&x);
    20. printf("\n 出栈元素是 %d",x);
    21. Destroystack(&s);
    22. return 0;
    23. }

    三,栈链

    1. #include
    2. #include
    3. typedef struct stacknode{
    4. int data;
    5. struct stacknode *next;
    6. }stackNode,*Linkstack;
    7. void Initstack(Linkstack *s){
    8. *s=(Linkstack)malloc(sizeof(stackNode));
    9. (*s)->next=NULL;
    10. }
    11. void Push(Linkstack s,int x){
    12. Linkstack p=(Linkstack)malloc(sizeof(stackNode));
    13. if(!p)exit(0);
    14. p->data=x;
    15. p->next=s->next;
    16. s->next=p;
    17. }
    18. void Gettop(Linkstack s,int *e){
    19. if(s->next==NULL)exit(0);
    20. *e=s->next->data;
    21. }
    22. int Empty(Linkstack s){
    23. return (s->next==NULL);
    24. }
    25. void Pop(Linkstack s,int *e){
    26. if(s->next==NULL){
    27. printf("空!");exit(0);
    28. }
    29. stackNode *p=s->next;
    30. e=p->data;
    31. s->next=p->next;
    32. free(p);
    33. }
    34. void Destroystack(Linkstack s){
    35. Linkstack p=s->next,q;
    36. while(p!=NULL){
    37. q=p->next;
    38. free(p);
    39. p=q;
    40. }
    41. free(s);
    42. }
    43. int main(){
    44. Linkstack s;
    45. Initstack(&s);
    46. int n,x;scanf("%d",&n);
    47. for(int i=0;i
    48. scanf("%d",&x);
    49. Push(&s,x);
    50. }
    51. Gettop(&s,&x);
    52. printf("栈顶元素是 %d\n",x);
    53. int flag=Empty(s);
    54. if(flag==0)printf("空!");
    55. else printf("非空!");
    56. Pop(&s,&x);
    57. printf("出栈元素是 %d",x);
    58. Destroystack(&s);
    59. return 0;
    60. }

    四,进制转换

    五,表达式求值

    六,括号的匹配问题

    七,迷宫问题

    八,中缀表达式求值

    题目描述

    编写一个算法,利用栈求解中缀算术表达式的值。运算符包括+、-、*、/、(、)和=,参加运算的数为个位数整数类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)

    输入

    输入一个需要计算的算术表达式,例如:2+2=。

    输出

    输出为表达式的运算结果。

    样例输入 Copy
    1+1=
    样例输出 Copy
    2

     

    1. #include
    2. #include
    3. typedef struct Node {
    4. int data;
    5. struct Node *next;
    6. } Node;
    7. typedef struct {
    8. Node *top;
    9. } Stack;
    10. int is_operator(char ch) {
    11. return (ch == '+' || ch == '-' || ch == '*' || ch == '/');
    12. }
    13. int priority(char op) {
    14. switch (op) {
    15. case '+':
    16. case '-':
    17. return 1;
    18. case '*':
    19. case '/':
    20. return 2;
    21. default:
    22. return 0;
    23. }
    24. }
    25. int calculate(int a, char op, int b) {
    26. switch (op) {
    27. case '+':
    28. return a + b;
    29. case '-':
    30. return a - b;
    31. case '*':
    32. return a * b;
    33. case '/':
    34. return a / b;
    35. default:
    36. exit(1);
    37. }
    38. }
    39. Stack *create_stack() { // 创建空栈
    40. Stack *stack = (Stack *)malloc(sizeof(Stack));
    41. stack->top = NULL;
    42. return stack;
    43. }
    44. void push(Stack *stack, int data) { // 入栈操作
    45. Node *node = (Node *)malloc(sizeof(Node));
    46. node->data = data;
    47. node->next = stack->top;
    48. stack->top = node;
    49. }
    50. int pop(Stack *stack) { // 出栈操作
    51. if (stack->top == NULL) {
    52. return -1; // 如果栈为空,则返回-1
    53. }
    54. Node *node = stack->top;
    55. int data = node->data;
    56. stack->top = node->next;
    57. free(node);
    58. return data;
    59. }
    60. int top(Stack *stack) { // 返回栈顶元素
    61. if (stack->top == NULL) {
    62. return -1; // 如果栈为空,则返回-1
    63. }
    64. return stack->top->data;
    65. }
    66. int evaluate_expression(char *expression) {
    67. Stack *s1 = create_stack(); // 操作数栈,用于存储操作数
    68. Stack *s2 = create_stack(); // 操作符栈,用于存储操作符
    69. for (int i = 0; expression[i] != '='; i++) {
    70. if (is_operator(expression[i])) { // 如果当前字符为操作符
    71. while (s2->top != NULL && priority(top(s2)) >= priority(expression[i])) {
    72. // 如果操作符栈不为空,并且栈顶操作符的优先级大于等于当前操作符的优先级
    73. int b = pop(s1); // 出栈一个操作数作为运算的右操作数
    74. int a = pop(s1); // 再出栈一个操作数作为运算的左操作数
    75. char op = pop(s2); // 出栈一个操作符
    76. int result = calculate(a, op, b); // 计算两个操作数和操作符的结果
    77. push(s1, result); // 将计算结果入栈到操作数栈中
    78. }
    79. push(s2, expression[i]); // 当前操作符入栈到操作符栈中
    80. } else if (expression[i] == '(') { // 如果当前字符为左括号
    81. push(s2, expression[i]); // 入栈到操作符栈中
    82. } else if (expression[i] == ')') { // 如果当前字符为右括号
    83. while (top(s2) != '(') { // 循环执行直到遇到左括号
    84. int b = pop(s1); // 出栈一个操作数作为运算的右操作数
    85. int a = pop(s1); // 再出栈一个操作数作为运算的左操作数
    86. char op = pop(s2); // 出栈一个操作符
    87. int result = calculate(a, op, b); // 计算两个操作数和操作符的结果
    88. push(s1, result); // 将计算结果入栈到操作数栈中
    89. }
    90. pop(s2); // 弹出左括号
    91. } else { // 如果当前字符为数字
    92. int num = expression[i] - '0'; // 将当前字符转换成数字
    93. while (expression[i + 1] >= '0' && expression[i + 1] <= '9') {
    94. // 如果下一个字符也是数字,则将其合并到一起
    95. num = num * 10 + expression[++i] - '0';
    96. }
    97. push(s1, num); // 将数字入栈到操作数栈中
    98. }
    99. }
    100. // 处理剩余的操作符
    101. while (s2->top != NULL) {
    102. int b = pop(s1); // 出栈一个操作数作为运算的右操作数
    103. int a = pop(s1); // 再出栈一个操作数作为运算的左操作数
    104. char op = pop(s2); // 出栈一个操作符
    105. int result = calculate(a, op, b); // 计算两个操作数和操作符的结果
    106. push(s1, result); // 将计算结果入栈到操作数栈中
    107. }
    108. return pop(s1); // 返回最终的计算结果
    109. }
    110. int main() {
    111. char expression[100];
    112. scanf("%s", expression);
    113. int result = evaluate_expression(expression);
    114. printf("%d\n", result);
    115. return 0;
    116. }

    wenti:

    1. #include
    2. #include
    3. typedef struct stacknode{
    4. int data;
    5. struct stacknode *next;
    6. }StackNode,*StackLink;
    7. StackLink *Initstack(){
    8. StackLink s;
    9. s=(StackLink)malloc(sizeof(StackNode));
    10. s->next=NULL;
    11. return s;
    12. }
    13. void Push(StackLink stack,int e){
    14. StackNode *node=(StackNode *)malloc(sizeof(StackNode));
    15. //if(!node)exit(0);
    16. node->data=e;
    17. node->next=stack->next;
    18. stack->next=node;
    19. }
    20. int Pop(StackLink stack,int *e){
    21. if(stack->next ==NULL)return 0;
    22. StackLink p=stack->next;
    23. * e=p->data;
    24. stack->next=p->next;
    25. free(p);
    26. return 1;
    27. }
    28. int GetTop(StackLink stack,int *e){
    29. if(stack->next==NULL){
    30. return -1;
    31. }
    32. *e=stack->next->data;
    33. return 0;
    34. }
    35. int is_operator(char x){
    36. if(x=='+'||x=='-'||x=='*'||x=='/'){
    37. return 1;
    38. }
    39. return 0;
    40. }
    41. int prio(char ope){
    42. switch(ope){
    43. case'+':
    44. case'-':
    45. return 1;
    46. case'*':
    47. case'/':
    48. return 2;
    49. default:
    50. return 0;
    51. }
    52. }
    53. int calculate(int a,char op,int b){
    54. switch(op){
    55. case'+':return a+b;
    56. case'-':return a-b;
    57. case'*':return a*b;
    58. case'/':return a/b;
    59. default:exit(0);
    60. }
    61. }
    62. int Get_evaluate(char exp[1000]){
    63. StackLink s1,s2;
    64. s1=Initstack();
    65. s2=Initstack();
    66. for(int i=0;exp[i]!='=';i++){
    67. if(is_operator(exp[i])==1){//运算符
    68. if(s2->next !=NULL && prio(s2->next)>=prio(exp[i])){
    69. int b;Pop(s1,&b);
    70. int a;Pop(s2,&a);
    71. char op;Pop(s1,&op);
    72. int result =calculate(a,op,b);
    73. Push(s1,result);
    74. }
    75. }
    76. else if(exp[i]=='('){
    77. Push(s2,exp[i]);
    78. }
    79. else if(exp[i]==')'){
    80. while(s2->data!='('){
    81. int b;Pop(s1,&b);
    82. int a;Pop(s2,&a);
    83. char op;Pop(s1,&op);
    84. int result =calculate(a,op,b);
    85. Push(s1,result);
    86. }
    87. int a;Pop(s2,a);//a存放s2出栈数字
    88. }
    89. else{//数字
    90. int num=exp[i]-'0';
    91. while(exp[i+1]>='0'&&exp[i+1]<='9'){
    92. num=num*10+exp[++i]-'0';
    93. }
    94. Push(s1,num);
    95. }
    96. }
    97. // 处理剩余的操作符
    98. while (s2->next != NULL) {
    99. int b;Pop(s1,&b);
    100. int a;Pop(s2,&a);
    101. char op;Pop(s1,&op);
    102. int result =calculate(a,op,b);
    103. Push(s1,result);
    104. }
    105. int t;Pop(s1,&t); // 返回最终的计算结果
    106. return t;
    107. }
    108. int main(){
    109. char exp[1000];
    110. scanf("%s",exp);
    111. int result =Get_evaluate(exp);
    112. printf("%d",result);
    113. return 0;
    114. }

    九,双向栈的基本操作

    题目描述

    将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈算法的函数。函数调用次序依次为:进栈、栈满的判断、出栈、栈空的判断。

    输入

    第一行为一个整数m,表示数组V的大小,

    第二行为四个整数e0、e1、d0、d1,e0和e1分别代表压入0号栈和1号栈的整数序列E0和E1的长度(依次连续入栈,中间没有出栈的情况),d0和d1分别代表从0号栈和1号栈弹出的序列的长度(依次连续出栈,中间没有入栈的情况)。

    第三行和第四行分别表示序列E0和E1。

    输出

    第一行代表进栈操作完成时栈是否为满(出栈操作尚未执行),栈满输出1,栈不满输出0。

    第二行对应0号栈,第二行包括d0+1个整数,其中前d0个整数代表出栈序列D0,最后一个整数代表出栈操作完成时0号栈是否为空,栈空输出0,不空输出1。

    第三行对应1号栈,第三行包括d1+1个整数,其中前d1个整数代表出栈序列D1,最后一个整数代表出栈操作完成时1号栈是否为空,栈空输出0,不空输出1。整数之间用空格分隔。

    样例输入 Copy
    1. 7
    2. 3 4 2 2
    3. 1 2 3
    4. 2 3 4 5
    样例输出 Copy
    1. 1
    2. 3 2 1
    3. 5 4 1
    1. #include
    2. #include
    3. typedef int elem;
    4. typedef struct
    5. {
    6. int top[2];//定义栈顶和栈底指针 int bot[2];
    7. int *V; //栈数组
    8. int m; //栈最大可容纳元素个数
    9. }DblStack;
    10. //初始化双栈
    11. void InitDblStack(DblStack *stack,int x)
    12. {
    13. int *arr = (elem*)malloc(x*sizeof(elem));//申请空间
    14. stack->V = arr; //将V指针指向申请的空间
    15. stack->m = x; //初始化栈最大可容纳最大元素个数
    16. stack->top[0] = -1; //左栈栈顶指针初始化
    17. stack->top[1] = stack->m; //右栈栈顶指针初始化
    18. //stack->bot[0] = 0; //左栈栈底指针初始化
    19. //stack->bot[1] = stack->m-1; //右栈栈底指针初始化
    20. }
    21. //判断总体是否为空栈
    22. int EmptyDblStack(DblStack stack)
    23. {
    24. if(stack.top[0] == -1 && stack.top[1] == stack.m)
    25. return 1; //若是返回1
    26. return 0; //否则返回0
    27. }
    28. //判断左栈是否为空栈
    29. int EmptyLeft(DblStack stack)
    30. {
    31. if(stack.top[0] == -1)
    32. return 0; //若是返回1
    33. return 1; //否则返回0
    34. }
    35. //判断右栈是否为空栈
    36. int EmptyRight(DblStack stack)
    37. {
    38. if(stack.top[1] == stack.m )//加&& stack.top[0]==-1
    39. return 0; //若是返回1
    40. return 1; //否则返回0
    41. }
    42. //判断是否为满栈
    43. int FullDblStack(DblStack stack)
    44. {
    45. if(stack.top[1] - stack.top[0]==1 || stack.top[0] >= stack.m || stack.top[1] < 0 )
    46. //三种满栈情况左右两栈中间相遇,左栈满,右栈满
    47. return 1;//满栈返回1
    48. return 0;//否则返回0
    49. }
    50. int Fullleft(DblStack stack){
    51. if(stack.top[0] >= stack.m )return 1;
    52. else return 0;
    53. }
    54. int Fullright(DblStack stack){
    55. if(stack.top[1] <0 )return 1;
    56. else return 0;
    57. }
    58. //左栈进栈
    59. int pushLeft(DblStack *stack, elem e)
    60. {
    61. if (stack->top[1] - stack->top[0] ==1)//判断是否为满栈
    62. {
    63. printf("栈已满不能进行进栈操作\n");
    64. return 0; //满栈返回0
    65. }
    66. stack->top[0]++; //左栈栈顶指针加一
    67. stack->V[stack->top[0]] = e; //将数据元素进栈
    68. //printf("%d ",stack->V[stack->top[0]]);
    69. return 1; //完成操作返回1
    70. }
    71. //右栈进栈
    72. int pushRight(DblStack *stack, elem e)
    73. {
    74. if (stack->top[1] - stack->top[0] ==1)//判断是否为满栈
    75. {
    76. printf("栈已满,无法进行进栈操作\n");
    77. return 0; //满栈返回0
    78. }
    79. else{
    80. stack->top[1]--; //右栈栈顶指针加一
    81. stack->V[stack->top[1]] = e; //将数据元素进栈
    82. //printf("%d ",stack->V[stack->top[1]]);
    83. return 1;
    84. }
    85. }
    86. //左栈出栈
    87. elem popLeft(DblStack *stack)
    88. {
    89. if (stack->top[0] == -1)//判断是否为空栈
    90. {
    91. printf("左栈已空,无法进行出栈操作\n");
    92. return 0; //空栈返回0
    93. }
    94. elem e = stack->V[stack->top[0]]; //取出栈顶数据元素
    95. stack->top[0]--; //左栈栈顶元素减一
    96. // stack->V[stack->top[0]];
    97. return e; //返回原栈顶元素
    98. }
    99. //右栈出栈
    100. elem popRight(DblStack *stack)
    101. {
    102. if (stack->top[0] == stack->m) //判断是否为空栈
    103. {
    104. printf("右栈已空,无法进行出栈操作\n");
    105. return 0; //空栈返回0
    106. }
    107. elem e = stack->V[stack->top[1]]; //取出右栈栈顶元素
    108. stack->top[1]++; //右栈栈顶指针加一
    109. return e; //返回原栈顶元素
    110. }
    111. //遍历双栈
    112. void printDblStack(DblStack stack)
    113. {
    114. for (int i = 0; i <= stack.top[0]; i++) //输出左栈
    115. {
    116. printf("%d ", stack.V[i]);
    117. }
    118. printf("\n");
    119. for(int i = stack.top[1]; i < stack.m; i++)//输出右栈
    120. {
    121. printf("%d ", stack.V[i]);
    122. }
    123. printf("\n");
    124. }
    125. //调试
    126. int main()
    127. {
    128. int m,e0,e1,d0,d1;
    129. DblStack stack;
    130. scanf("%d",&m);
    131. InitDblStack(&stack,m); //初始化双栈
    132. scanf("%d %d %d %d",&e0,&e1,&d0,&d1);
    133. for(int j=0;j//左栈进栈
    134. int E0[e0];
    135. scanf("%d",&E0[j]);
    136. pushLeft(&stack, E0[j]);
    137. }
    138. for(int j=0;j//右栈进栈
    139. int E1[e1];
    140. scanf("%d",&E1[j]);
    141. pushRight(&stack, E1[j]);
    142. }
    143. // printDblStack(stack);
    144. printf( FullDblStack(stack) ==1?"1":"0");//判断是否为满栈
    145. printf("\n");
    146. for(int j=0;j
    147. int x=popLeft(&stack);
    148. printf("%d ",x);
    149. }
    150. int x=EmptyLeft(stack);
    151. printf("%d",x);
    152. printf("\n");
    153. for(int j=0;j
    154. int x=popRight(&stack);
    155. printf("%d ",x);
    156. }
    157. x=EmptyRight(stack);
    158. printf("%d",x);
    159. printf("\n");
    160. // printDblStack(stack);
    161. return 0;
    162. }

    十,括号匹配

    题目描述

    ​​​​​​​
    编写一个算法,利用栈检查一个字符数组表示的字符中的花括号、方括号和圆括号是否配对,若能够全部配对则返回1,否则返回0。

    输入

    输入需要检查的括号字符串,例如:{{([][])}()}。

    输出

    输出检查结果(全部配对则返回1,否则返回0)。

    样例输入 Copy
    {{([][])}()}
    样例输出 Copy
    1
    1. #include
    2. #include
    3. #include
    4. #include
    5. #define MaxSize 100 //定义栈中元素最大个数
    6. typedef struct{
    7. char data[MaxSize];
    8. int top;
    9. }SqStack;
    10. //初始化栈
    11. void InitStack(SqStack *S){
    12. S->top = -1;
    13. }
    14. //判断栈是否为空
    15. bool IsEmpty(SqStack S){
    16. if(S.top == -1){
    17. return true;
    18. }
    19. return false;
    20. }
    21. //新元素入栈
    22. void Push(SqStack *S,char x){
    23. if(S->top == MaxSize-1){
    24. printf("栈已满"); //栈已满
    25. return;
    26. }
    27. S->top += 1;
    28. S->data[S->top] = x;
    29. }
    30. //栈顶元素出栈,用x返回
    31. void Pop(SqStack *S,char *x){
    32. if(S->top == -1){
    33. printf("栈已满");
    34. return;
    35. }
    36. *x = S->data[S->top];
    37. S->top -= 1;
    38. }
    39. //匹配算法
    40. bool bracketCheck(char str[],int length){
    41. SqStack S;
    42. InitStack(&S); //初始化栈
    43. for(int i=0;i
    44. if(str[i]=='('||str[i]=='{'||str[i]=='['){
    45. Push(&S,str[i]); //扫描到左括号就入栈
    46. }else{
    47. if(IsEmpty(S)){ //扫描到右括号,当前栈为空,即右括号单身情况
    48. return false; //匹配失败
    49. }
    50. char topElem; //用来保存弹出栈的栈顶元素
    51. Pop(&S,&topElem); //栈顶元素出栈
    52. if(str[i]==')'&&topElem!='('){
    53. return false;
    54. }
    55. if(str[i]=='}'&&topElem!='{'){
    56. return false;
    57. }
    58. if(str[i]==']'&&topElem!='['){
    59. return false;
    60. }
    61. }
    62. }
    63. return IsEmpty(S);
    64. }
    65. int main(){
    66. char s[MaxSize];
    67. scanf("%s",s);
    68. int len = strlen(s);
    69. if(bracketCheck(s,len)){
    70. printf("1");
    71. }else{
    72. printf("0");
    73. }
    74. return 0;
    75. }

    十一,进制转换

    题目描述

    编写一个算法,利用栈将一个非负的十进制整数分别转换为一个二进制数、一个八进制数和一个十六进制数。

    输入
    输入需要转换的十进制元素,例如:666。
    输出

    第一行输出转换后的二进制元素,例如:1010011010;

    第二行输出转换后的八进制元素,例如:1232;
    第三行输出转换后的十六进制元素,例如:29A。

    样例输入 Copy
    666
    样例输出 Copy
    1. 1010011010
    2. 1232
    3. 29A
    1. #include
    2. #include
    3. //#ifndef __STACK_H
    4. //#define __STACK_H
    5. #define MaxSize 1000
    6. typedef int ElemType;
    7. typedef struct {
    8. ElemType data[MaxSize];
    9. int top;
    10. }Sqstack;
    11. //创建一个空栈
    12. Sqstack * Stack_Creat(Sqstack * Stack)
    13. {
    14. Stack = (Sqstack *)malloc(sizeof(Sqstack));
    15. if(Stack == NULL)
    16. {
    17. printf("空间已满!\n");
    18. return 0;
    19. }
    20. Stack->top = -1; //空栈
    21. return Stack;
    22. }
    23. //摧毁栈
    24. void Stack_Destory(Sqstack * Stack)
    25. {
    26. free(Stack);
    27. }
    28. //出栈
    29. ElemType Stack_Pop(Sqstack * Stack)
    30. {
    31. ElemType e=-1;
    32. if(Stack->top == -1)
    33. printf("该栈为空栈,无法出栈!\n");
    34. else
    35. {
    36. e = Stack->data[Stack->top];
    37. Stack->top--;
    38. }
    39. return e;
    40. }
    41. //入栈
    42. void Stack_Push(Sqstack * Stack,ElemType e)
    43. {
    44. if(Stack->top == MaxSize - 1)
    45. {
    46. printf("栈已满,无法入栈!\n");
    47. }
    48. else
    49. {
    50. Stack->top++;
    51. Stack->data[Stack->top] = e;
    52. }
    53. }
    54. //判断栈是否为空
    55. int Stack_Empty(Sqstack * Stack)
    56. {
    57. return (Stack->top == -1 );
    58. }
    59. void DTB(int num,Sqstack * Stack)
    60. {
    61. char num_b[33] ; //用来存放转换出来的二进制
    62. char * temp = num_b;
    63. while(num) //入栈
    64. {
    65. Stack_Push(Stack,num%2);
    66. num /= 2;
    67. }
    68. while(!Stack_Empty(Stack))//出栈 直到栈为空
    69. {
    70. *temp = Stack_Pop(Stack) + '0';
    71. temp++;
    72. }
    73. *temp = '\0';
    74. printf("%s\n",num_b);
    75. }
    76. void DTO(int num,Sqstack * Stack)
    77. {
    78. char num_o[12] ; //用来存放转换出来的二进制
    79. char * temp = num_o;
    80. while(num) //入栈
    81. {
    82. Stack_Push(Stack,num%8);
    83. num /= 8;
    84. }
    85. while(!Stack_Empty(Stack))//出栈 直到栈为空
    86. {
    87. *temp = Stack_Pop(Stack) + '0';
    88. temp++;
    89. }
    90. *temp = '\0';
    91. printf("%s\n",num_o);
    92. }
    93. void DTH(int num,Sqstack * Stack)
    94. {
    95. char num_h[12] ; //用来存放转换出来的二进制
    96. char * temp = num_h;
    97. int top_num;
    98. while(num) //入栈
    99. {
    100. Stack_Push(Stack,num%16);
    101. num /= 16;
    102. }
    103. while(!Stack_Empty(Stack))//出栈 直到栈为空
    104. {
    105. top_num = Stack_Pop(Stack);
    106. if(top_num>9)
    107. *temp = top_num - 10 + 'A';
    108. else
    109. *temp = top_num + '0';
    110. temp++;
    111. }
    112. *temp = '\0';
    113. printf("%s\n",num_h);
    114. }
    115. int main(){
    116. int flag=1,a,num_d;
    117. Sqstack * Stack;
    118. Stack = Stack_Creat(Stack);
    119. scanf("%d",&num_d);
    120. if(num_d>0){
    121. DTB(num_d,Stack);
    122. DTO(num_d,Stack);
    123. DTH(num_d,Stack);
    124. }
    125. if(num_d==0){
    126. printf("0 \n0 \n0 \n");
    127. }
    128. return 0;
    129. }

    十二,入栈出栈基本操作

    题目描述

    输入一个整数序列a1,a2,a3...,an。当ai不等于-1时将ai进栈;当ai=-1时,输出栈顶元素并将其出栈。

    输入

    第一行为序列的长度n,

    第二行为n个整数,整数之间用空格分隔。

    输出
    输出若干行,每行为相应的出栈元素。当出栈异常时,输出“出栈失败”并结束数据的输出。
    样例输入 Copy
    1. 5
    2. 1 2 -1 -1 1
    样例输出 Copy
    1. 2
    2. 1
    1. #include
    2. #include
    3. //#define initsize 5
    4. #define incresize 5
    5. typedef struct Sqstack{
    6. int *base;
    7. int *top;
    8. int stacksize;
    9. }Sqstack;
    10. void InitStack(Sqstack *s,int initsize){
    11. (*s).base=(int *)malloc(initsize*sizeof(int));
    12. if(!(*s).base)exit(0);
    13. (*s).top=(*s).base;
    14. (*s).stacksize=initsize;
    15. }
    16. void Push(Sqstack *s,int e){
    17. if((*s).top-(*s).base >= (*s).stacksize){
    18. (*s).base=(int*)realloc((*s).base,((*s).stacksize+incresize)*sizeof(int));
    19. if(!(*s).base)exit(0);
    20. (*s).top=(*s).base+(*s).stacksize;
    21. (*s).stacksize+=incresize;
    22. }
    23. *((*s).top)=e;
    24. (*s).top++;
    25. }
    26. void GetTop(Sqstack s,int *e){
    27. if(s.top==s.base) printf("empty!");
    28. *e=*(s.top-1);
    29. }
    30. int StackLength(Sqstack s){
    31. return s.top-s.base;
    32. }
    33. int StackEmpty(Sqstack s){
    34. if(s.top==s.base)return 0;
    35. else return 1;
    36. }
    37. void Pop(Sqstack *s,int *e){
    38. if((*s).top==(*s).base) exit(0);
    39. (*s).top--;
    40. *e=*((*s).top);
    41. }
    42. void Destroystack(Sqstack *s){
    43. if(s!=NULL){
    44. free((*s).base);
    45. (*s).base=NULL; (*s).top=NULL;
    46. (*s).stacksize=0;
    47. }
    48. }
    49. int main(){
    50. Sqstack s;
    51. int n;
    52. scanf("%d",&n);
    53. InitStack(&s,n);
    54. int e,p,x;
    55. s.stacksize=n;
    56. for(int j=0;j
    57. scanf("%d",&e);
    58. if(e!=-1){
    59. Push(&s,e);
    60. }
    61. else{
    62. if(StackEmpty(s)==0) //printf("\n非空!");
    63. {
    64. printf("出栈失败");
    65. exit(0);
    66. }
    67. GetTop(s,&p);
    68. printf("%d\n",p);
    69. Pop(&s,&x);
    70. //printf("%d",x);
    71. }
    72. }
    73. return 0;
    74. }

  • 相关阅读:
    【yolo训练数据集】标注好的垃圾分类数据集共享
    VSCode 运行java程序中文乱码
    git merge与git rebase详解
    【Web3 系列开发教程——创建你的第一个 NFT(7)】创建一个 NFT DApp,给你的 NFT 赋予属性,例如图片
    Python3 笔记:upper()、isupper()、lower()、islower()、swapcase()
    mapper.updateById(User),修改为”“失败的解决方案
    【Leetcode】204. 计数质数
    pycharm基本使用(常用快捷键)
    ubuntu安装ssh,设置开机自启动
    为什么要做字节对齐 alignment?
  • 原文地址:https://blog.csdn.net/m0_74161592/article/details/133798247