当前位置:首页 » 编程语言 » c语言的顺序栈

c语言的顺序栈

发布时间: 2022-07-24 08:59:10

㈠ 关于c语言的顺序栈的操作

这是我以前写的,今天不想砍代码,就发这个了
#include<stdio.h>
#include<stdlib.h>
#define N 100
//栈的结构定义
typedef struct
{
int elem[N];
int top;//栈顶
}Stack;
//循环队列的结构定义
typedef struct
{
int elem[N];
int front;
int rear;
}Queue;
int Greatstack(Stack*);
int GreatQueue(Queue *);
int pop(Stack *s);
void show(Stack *s);
int push(Stack *s);
int popStack(Stack *s);
int enQueue(Queue *q);
int deQueue(Queue *q);
int printQueue(Queue *q);
void conversion();
void main()
{
char exit='N';
int ch;
int result,data;
int m,e;
Stack s;
Queue q;
s.top=0;//栈顶指向当前栈顶的下一位置
q.front=q.rear=0;
do
{
system("CLS");
printf("\t\t********************************************\n");
printf("\t\t* 1.创建一个顺序栈 .................(1) *\n");
printf("\t\t* 2.出栈.............................(2) *\n");
printf("\t\t* 3.入栈.............................(3) *\n");
printf("\t\t* 4.顺序栈中元素依次出栈,并显示.....(4) *\n");
printf("\t\t* 5.创建一个循环队列.................(5) *\n");
printf("\t\t* 6.进队.............................(6) *\n");
printf("\t\t* 7.出队.............................(7) *\n");
printf("\t\t* 8.循环队列中元素依次出队,并显示...(8) *\n");
printf("\t\t* 9.十进制数转换为其它进制数.........(9) *\n");
printf("\t\t* 10.退出 ..............(10) *\n");
printf("\t\t********************************************\n");
printf("\n请选择操作代码:");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("创建一个顺序栈\n");
result=Greatstack(&s);
if(result==0)printf("顺序栈创建失败,栈已满!\n");
else printf("顺序栈创建成功!\n");
system("pause");
break;
case 2:
printf("出栈:\n");
m=pop(&s);
if(m==0)printf("出栈失败,栈已空!\n");
else
{
printf("顺序栈出栈成功!\n");
printf("该栈剩余元素为:");
show(&s);
}
//请加入出栈操作的代码或函数调用
system("pause");
break;
case 3:
printf("进栈:\n");
printf("请输入入栈的元素");
scanf("%d",&e);
result=push(&s,e);
if(result==0)printf("栈已满!\n");
else
{
printf("顺序栈入栈成功!\n");
printf("该栈剩余元素为:");
show(&s);
}
//请加入进栈操作的代码或函数调用
system("pause");
break;
case 4:
printf("顺序栈中元素依次出栈,出栈序列为:\n");
popStack(&s);
//请加入依次出栈并显示元素操作的代码或函数调用
system("pause");
break;
case 5:
printf("创建一个循环队列\n");
result=GreatQueue(&q);
if(result==0)printf("循环队列创建失败,循环队列已满!\n");
else printf("循环队列创建成功!\n");
system("pause");
break;
case 6:
printf("入队:\n");
data=enQueue(&q);
if(result=0) printf("队已经满了\n");
else printf("入队成功\n");
//请加入入队操作的代码或函数调用
system("pause");
break;
case 7:
printf("出队:\n");
data=deQueue(&q);
if(data=0) printf("队已经空了\n");
else printf("出队成功\n");
//请加入依次出队操作的代码或函数调用
system("pause");
break;
case 8:
printf("循环队列中元素依次出队,出队序列为:\n");
//请加入依次出队并显示元素操作的代码或函数调用
data=printQueue(&q);
system("pause");
break;
case 9:
printf("十进制数转换为其它进制数:\n");
conversion();
//请加入十进制数转换为其它进制数操作的代码或函数调用
system("pause");
break;
case 10:
getchar();
printf("\n您是否真的要退出程序(Y/N):");
exit=getchar();getchar();
break;
default:
printf("\n无效输入,请重新选择...:");
}
}while(exit!='y'&&exit!='Y');
}
/*从键盘输入一系列整数,当输入值为0时,停止输入,产生顺序栈*/
/*返回0表示生成成功,1表示失败*/
int Greatstack(Stack *s)
{
int e;
s->top=0;//栈顶指向当前栈顶的下一位置
printf("请依次输入需要入栈的元素,以0表示输入结束:");
do
{
scanf("%d",&e);
if(e!=0)
{ if(s->top>=N)return 0;//栈满
s->elem[s->top++]=e;
}
}while(e!=0);
}
/*从键盘输入一系列整数,当输入值为0时,停止输入,产生循环队列*/
/*返回0表示生成成功,1表示失败*/
int GreatQueue(Queue *q)
{
int e;
q->front=q->rear=0;//初始化队列
printf("请依次输入需要入栈的元素,以0表示输入结束:");
do
{
scanf("%d",&e);
if(e!=0)
{ if((q->rear+1)%N==q->front)return 0;//队满
q->elem[q->rear]=e;
q->rear=(q->rear+1)%N;
}
}while(e!=0);
return 1;
}
int pop(Stack *s) //出栈
{
if(s->top==0)
return 0;
--s->top;
}
void show(Stack *s) //显示栈中的元素
{
int i=s->top;
while(i!=0)
{
--i;
printf("%d ",s->elem[i]);
}
}
int push(Stack *s,int e) //入栈
{
if(s->top>=N)return 0;
s->elem[s->top++]=e;
}
int popStack(Stack *s) //顺序栈中元素依次出栈,并显示
{
while(s->top!=0)
{
--s->top;
printf("%3d",s->elem[s->top]);
}
return 0;
}
int enQueue(Queue *q) //入队
{
int e;
printf("请输入入栈的元素:");
scanf("%d",&e);
if((q->rear+1)%N == q->front) return 0;
q->elem[q->rear]=e;
q->rear=(q->rear+1)%N;
return 1;
}
int deQueue(Queue *q) //出队
{
int *e;
if(q->front == q->rear) return 0;
e =q->elem[q->front];
q->front=(q->front+1)%N;
return 1;
}
int printQueue(Queue *q) //循环队列中元素依次出队,并显示
{
if(q->front == q->rear) return 0;
for(;q->front!=q->rear;)
{
printf("%3d",q->elem[q->front]);
q->front++;
}
}
void conversion() //十进制数转换为其它进制数
{
Stack p1;
int n,m;
puts("请输入需要转换的元素:");
scanf("%d",&n);
puts("请输入需要转换的进制:");
scanf("%d",&m);
p1.top=0;
while(n)
{
push(&p1,n%m);
n=n/m;
}
popStack(&p1);
}

㈡ for c语言实现顺序栈的建立

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define STACKINCREMENT 4 //宏定义错误,不要分号
#define STACK_INIT_SIZE 40
typedef struct{
int* base;
int* top;
int stacksize;
}sqstack;
int Initstack(sqstack &s);
int Push(sqstack &s, int e);
void Print(sqstack &s);
int Empty(sqstack &s);
int Pop(sqstack &s,int &e);

int main() //主函数
{
}

void StackInit(sqstack &s)
{
s.base = (int*)malloc(sizeof(int)*STACK_INIT_SIZE); //报错点(改用new也不行)
if(!s.base) exit(-1);
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
}

㈢ c语言函数参数入栈顺序

从右向左;
例如:f(int a, int b, int c)
c先入栈,然后b,其次a;

㈣ C语言数据结构:利用两个顺序栈来实现一个列队的功能时遇到的问题

假设s1、s2的深度都是3
s1已满,从栈顶到栈低依次是:5、4、3
s2非空,从栈顶到栈底依次是:1、2
此时要想在入栈一个元素6的话,按照你的想法,
得把s1的数据出栈到一个缓冲区,然后把缓冲区中,在原来s1栈底的3挪动到s2的栈顶,
然后s1的4、5依次压回栈s1,然后s1就能够空出栈顶的一个位置了,对吧?
但是,这个放置s1出栈元素的缓冲区。。。也得是一个栈结构吧?否则的话,你怎么知道s1向缓冲区出栈的u元素
顺序呢?
这样就不是双栈模拟队列了,势必还得用到一个中间栈s3来满足你这种处理方式~
因此,双栈模拟队列时,当栈s1满,栈s2非空时,栈s1再执行进栈操作。因为双栈是没有s3的~

㈤ C语言参数入栈顺序为什么是从右向左

输出习惯是从左至右的,栈是后进先出的,从右至左入栈就顺应了这两条规律,很方便……

㈥ 求用C语言编写一个程序实现顺序栈初始化,出栈,入栈,判栈空,判栈满,急需,谢谢

#define STACK_SIZE 100
#define PUSH_POP_SUCCESS 1
#define PUSH_POP_ERROR 0
struct _stackbuf {
int _collection[STACK_SIZE];
int _top;
};
typedef struct _stackbuf S_STACK;
typedef unsigned int u_int_f;
// 入栈
u_int_f push(S_STACK *stack, int d){
if (stack->_top >= STACK_SIZE) return PUSH_POP_ERROR;
stack->_collection[stack->_top++] = d;
return PUSH_POP_SUCCESS;
}
// 出栈
u_int_f pop(S_STACK *stack, int *e){
if (!stack->_top) return PUSH_POP_ERROR;
*e=stack->_collection[--(stack->_top)];
return PUSH_POP_SUCCESS;
}
int main(){
S_STACK stack = { {0},0 };
push(&stack, 1);
push(&stack, 2);
push(&stack, 3);
int gv = 0;
pop(&stack, &gv);
printf("%d\n", gv);
system("PAUSE");
return 0;
}

㈦ C语言编程实现顺序栈的初始化,入栈,出栈,取栈顶元素,显示操作

#define STACKSIZE 100
int mstack[STACKSIZE],top,bottom;
void mInitStack() { top=bottom=0; }
void mPush(int x) { if ( top-bottom<=STACKSIZE ) { mstack[top]=x; top++; } }
int mPop() { int r=0; if ( top>bottom ) { r=mstack[top]; top--; } return r; }
void mShowStack() { int i; printf("["); for ( i=bottom;i<top;i++ ) printf("%d ",mstack[i]); printf("] "); }
void main()
{
int i,n,x,loop=1,s;
char buffer[80];
mInitStack();
scanf("%d",&n); for ( i=0;i<n;i++ ) { scanf("%d",&x); mPush(x); }
mShowStack();
while ( loop )
{ buffer[1]=0; gets(buffer); s=1;
switch ( buffer[1] )
{ case 'O':
case 'o': x=mPop(); break;
case 'U':
case 'u': x=atoi(buffer+5); mPush(x); break;
case 'n':
case 'N': loop=0; break;
default: s=0; break;
}
mShowStack();
}
mShowStack();

}

㈧ C语言怎么求顺序栈长度

这是指针相减的特性,指针相减就是两个之间的元素个数。
(unsigned int)S->top - (unsigned int)S->base; // 要得到实际的地址值相减强制转换成整数就行了

㈨ 求顺序栈的c语言

这是编译错误。。。。。。 醉了

热点内容
java4 发布:2025-01-31 11:08:42 浏览:355
什么是密码屏蔽 发布:2025-01-31 11:05:13 浏览:216
一个算法的效率可分为 发布:2025-01-31 11:05:12 浏览:639
win7用户名密码是什么 发布:2025-01-31 10:57:38 浏览:394
网址端口访问 发布:2025-01-31 10:49:30 浏览:512
javaweb代码 发布:2025-01-31 10:37:54 浏览:259
sqlserver合并 发布:2025-01-31 10:22:27 浏览:712
大理服务器地址 发布:2025-01-31 10:10:52 浏览:972
流上传文件 发布:2025-01-31 10:09:27 浏览:40
满赠算法 发布:2025-01-31 09:54:27 浏览:709