一个算法将一个顺序栈中的元素依次取出,并打印元素,如何把它改成一个具体c语言程序?

下面建栈、进栈和退栈的算法,如何把它变成具体的c语言程序,
比如我输入任意一段字符,如“abcdefg”,然后把它存入栈中,
再从栈中一个个打印出来。
我是新手,对栈的作用都明白了,但还不知道具体怎建栈和使用它,看起来它和普通的结构类型有什么不同啊,它也是结构类型吗?还有push()这个是系统定义好的,还是需要自己定义,可以反它改成push_1()吗?
#define N 100
struct
{
datatype data[N];
int top ;/*存放栈顶元素的下标*/
} S;

void push()
{if (s.top==m-1)栈满;
else
{s.top++;
s.data[top]=x;
}
}

void Pop (S, x)
{
if(S->top==-1) /*栈为空*/
exit(0);
else
{
x=S.data[S->top];
S->top--; /*修改栈顶指针*/
}
}

/*

请输入字符串: love LOVE

EVOL evol

Press any key to continue

*/

#include <stdio.h>
#include <stdlib.h>

#define N 100
typedef char SDataType;

typedef struct stack {
SDataType  data[N];
int top ;/*存放栈顶元素的下标*/
}STACK;

STACK *InitStack() {
STACK *ps = (STACK *)malloc(sizeof(STACK));
if(ps == NULL) {
printf("空间申请失败。\n");
exit(1);
}
ps->top = -1;
return ps;
}

int isFull(STACK *s) { // 判断栈是否是"满"的
return (s->top >= N);
}

int Push(STACK *s,SDataType x) { // 将x压入栈
if(isFull(s)) return 0;
s->top++;
s->data[s->top] = x;
return 1;
}

int isEmpty(STACK *s) { // 判断栈是否是"空"的
return (s->top == -1);
}
 
int Pop(STACK *s, SDataType *x) {
if(isEmpty(s))  return 0;
*x = s->data[s->top];
s->top--;  /*修改栈顶指针*/
return 1;
}

int main() {
char s[N],ch,i = 0;
STACK *ms = InitStack();
printf("请输入字符串: ");
gets(s);
while(s[i] && isFull(ms) == 0) {
Push(ms,s[i]);
++i;
}
while(isEmpty(ms) == 0) {
Pop(ms,&ch);
printf("%c",ch);
}
printf("\n");
free(ms);
return 0;
}

追问

typedef struct stack { }STACK;
stack这个小写的和这上大写的STACK有什么区别, 大定的应是自定义的一个类型吧、那这个小 写的呢? 和上楼的相比,这两种区别用法?

追答

stack是结构的名称,STACK是类型名,stack与struct配合,可以声明结构变量,如
struct stack a,*ps;
而STACK作为类型名,可以直接声明变量,如
STACK a[N];
请比较二者间的异同。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-10

栈这种数据结构,可用通过一个结构体封装,也可以不用。

push这个函数可以直接用。

下面按照你说的给一个例子,就用你给出的这段代码,将这段代码保存可以直接编译运行:

#include <stdlib.h>
#include <string.h>

#define N 100
struct
{
        char  data[N];
        int top ;
} S;

void push(char x)
{
        if (S.top == N-1);
        else
        {
                S.data[S.top]=x;
                S.top++;
        }
}

void pop (char *x)
{
        if(S.top==-1)  
                exit(0);  
        else 
        {
                *x=S.data[S.top];
                S.top--;  
        }
}

int main()
{
        char str[] = {'a', 'b', 'c', 'd', 'e', 'f'};
        char x;
        int i;

        S.top = 0;

        for(i = 0; i < (sizeof(str)/sizeof(char)); ++i) {
                putchar(str[i]);
                push(str[i]);
        }
        putchar('\n');
        for(i = 0; i < strlen(str); ++i) {
                pop(&x);
                putchar(x);
        }
        putchar('\n');

        return 0;

}

追问

一、struct /* a*/ /*建栈,这里不要加结构名吗,为什么可以不加,难道定义其它结构类型也可以不加吗?*/
{char data[N]; int top ;} S;
请问,你这个是用编译器写的

追答

我用的linux gcc哈
你这里只是个例子,只声明了一个全局变量,所以可以不加
当然,一般情况下要有结构名的,这只是个特例。
另外,这个例子程序中有一个小小的bug,不知道你发现没,就是45行的strlen,尽管不影响运行

本回答被网友采纳
第2个回答  2014-02-10

入栈出栈函数有误,按照你的例子,将“abcdefg”依次入栈,那你的datatype 的类型应该是字符,代码如下:

#include<stdio.h>
#include<string.h>

#define MAX_NUM 100

struct
{
 char data[MAX_NUM];
 int top;/*存放栈顶元素的下标*/
}S;


void push(char x)
{
 if (S.top== MAX_NUM-1)
 {
  //栈满;
 }
 else  
 {
  S.top++;
  S.data[S.top]=x;
 // printf("push %c,top :%d\n",x,S.top);
 }
}

void Pop (char *x)
{
 if(S.top == -1)
 {
  /*栈为空*/
  *x = '\0';
 }
 else  
 {
  *x=S.data[S.top];
  S.top--;/*修改栈顶指针*/
  //printf("pop %c,top :%d\n",*x,S.top);
 }
}

main()
{
 S.top = -1;
  char *p = "abcdefg";
 while(*p != '\0'){
  push(*p);
  p++;
 }
 
 char p1;
 do{
  Pop(&p1);
  printf(" %c ",p1);
 }while(p1 != '\0');
}

相似回答