一个算法将一个顺序栈中的元素依次取出,并打印元素,如何把它改成一个具体c语言程序?
下面建栈、进栈和退栈的算法,如何把它变成具体的c语言程序,比如我输入任意一段字符,如“abcdefg”,然后把它存入栈中,再从栈中一个个打印出来。我是新手,对栈的作用都明...
下面建栈、进栈和退栈的算法,如何把它变成具体的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--; /*修改栈顶指针*/
}
} 展开
比如我输入任意一段字符,如“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--; /*修改栈顶指针*/
}
} 展开
3个回答
展开全部
/*
请输入字符串: 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];
请比较二者间的异同。
展开全部
栈这种数据结构,可用通过一个结构体封装,也可以不用。
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,尽管不影响运行
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
入栈出栈函数有误,按照你的例子,将“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');
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询