扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
测试过了,可以运行。
公司主营业务:网站设计、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出德宏州免费做网站回馈大家。
int eval_postfix(char *exp){
while(*exp!='\0'){
if(is_number(*exp)){
int val = *exp - 48;
push(val);
}
else{
int a1 = pop();
int a2 = pop();
if(*exp=='+') push(a2+a1);
else if(*exp=='-') push(a2-a1);
else if(*exp=='*') push(a2*a1);
else if(*exp=='/') push(a2/a1);
}
exp ++;
}
return pop();
}
void push(int e){
stack[++top] = e;
}
int pop(){
return stack[top--];
}
整个程序是:
#include stdio.h
#include stdlib.h
#define MAX_SIZE 100
#define boolean unsigned char
#define true 1
#define false 0
// Global stack
int stack[MAX_SIZE];
int top = -1;
void push(int e);
int pop();
int eval_postfix(char *exp);
boolean is_number(char c);
void main ()
{
char exp[100]; // postfix expression
int result;
while(1) {
printf("\n Input postfix expression: ");
scanf("%s", exp);
result = eval_postfix(exp);
printf(" Result = %d \n\n", result);
}
}
boolean is_number(char c)
{
if (('0' = c) (c = '9'))
return true;
else
return false;
}
int eval_postfix(char *exp){
while(*exp!='\0'){
if(is_number(*exp)){
int val = *exp - 48;
push(val);
}
else{
int a1 = pop();
int a2 = pop();
if(*exp=='+') push(a2+a1);
else if(*exp=='-') push(a2-a1);
else if(*exp=='*') push(a2*a1);
else if(*exp=='/') push(a2/a1);
}
exp ++;
}
return pop();
}
void push(int e){
stack[++top] = e;
}
int pop(){
return stack[top--];
}
在keil C51中,直接调用库函数:
#includeintrins.h // 其中包含了对部分汇编指令的调用申明
_nop_(); // 产生一条NOP指令
_push_(acc); // 产生一条push指令
以下是intrins.h的内容
/*--------------------------------------------------------------------------
INTRINS.H
Intrinsic functions for C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __INTRINS_H__
#define __INTRINS_H__
extern void _nop_ (void);
extern bit _testbit_ (bit);
extern unsigned char _cror_ (unsigned char, unsigned char);
extern unsigned int _iror_ (unsigned int, unsigned char);
extern unsigned long _lror_ (unsigned long, unsigned char);
extern unsigned char _crol_ (unsigned char, unsigned char);
extern unsigned int _irol_ (unsigned int, unsigned char);
extern unsigned long _lrol_ (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
extern void _push_ (unsigned char _sfr);
extern void _pop_ (unsigned char _sfr);
#endif
这是我用链表写的:
#include stdio.h
#include stdlib.h
typedef struct node
{
int x;
struct node *next;
}Node;
typedef struct stack
{
Node *top;
}Stack;
void InitStack(Stack *s)
{
s-top=NULL;
}
int IsEmpty(Stack *s)
{
if(s-top==NULL)
return 1;
else
return 0;
}
void PushStack(Stack *s,int x)
{
Node *p;
p=(Node*)malloc(sizeof(Node));
p-x=x;
// p-next=NULL;
p-next=s-top;
s-top=p;
}
int PopStack(Stack *s)
{
int data;
Node *p;
p=(Node *)malloc(sizeof(Node));
if(IsEmpty(s))
{
printf("the stack is empty!\n");
free(p);
return -1;
}
else
{
p=s-top;
data=p-x;
s-top=p-next;
free(p);
return data;
}
}
int main (int argc,char **argv)
{
int i;
Stack s;
InitStack(s);
for(i=0;i1000;i++)
{
PushStack(s,i);
}
for(i=0;i1000;i++)
{
printf("%d\n",PopStack(s));
}
}
以下代码是基于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;
}
这个算是数据结构的内容讲解的是一个叫做栈类型的数据结构,这个数据结构的特点就是后进先出--最后放进去的数据最先拿出来。pop函数就是拿出数据的操作,push是放入是数据的操作。
内容拓展:
pop函数呵push函数的使用:
#include stdio.h
#include unistd.h
#include pthread.h
void *clean(void *arg)
{
printf("cleanup: %s \n",(char *)arg);
return (void *)0;
}
void * thr_fn1(void * arg)
{
printf("chread 1 start \n");
pthread_cleanup_push((void *)clean,"thraed 1 first handler");
pthread_cleanup_push((void *)clean,"thread 1 second handler");
printf("thread 1 push complete \n");
if(arg)
{
return ((void *)1);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)1;
}
//输出结果: chread 1 start -thread 1 push complte
//push和pop框起来的代码,不管正常退出还是异常退出,都将执行清除函数,但是存在特例:不包括return 退出。
#include stdio.h
#include stdlib.h
#define MAXSIZE 32
typedef struct{
int *elem;/* 栈的存储区 */
int max; /* 栈的容量,即找中最多能存放的元素个数 */
int top; /* 栈顶指针 */
}Stack;
int InitStack(Stack *S, int n) /*创建容量为n的空栈*/
{
S-elem = (int *)malloc(n * sizeof(int));
if(S-elem==NULL) return -1;
S-max=n;
S-top =0; //栈顶初值0
return 0;
}
int Push(Stack *S, int item) /*将整数item压入栈顶*/
{
if(S-top==S-max) {
printf("Stack is full! \n");
return -1;
}
S-elem[S-top++] = item; //压栈,栈顶加1
return 0;
}
int StackEmpty(Stack S)
{
return (!S.top)?1:0; /*判断栈是否为空*/
}
int Pop(Stack *S) /*栈顶元素出栈*/
{
if(!S-top) {
printf("Pop an empty stack!\n");
return -1;
}
return S-elem[--S-top] ; //弹出栈,栈顶减1
}
void MultibaseOutput(long n,int B)
{
int m; Stack S;
if(InitStack(S,MAXSIZE)){
printf("Failure!\n");
return;
}
do {
if (Push(S,B )) //------
{
printf("Failure!\n");
return;
}
n= n-1 ; //--------
}while(n!=0);
while(!StackEmpty(S)) { /*输出B进制的数*/
m=Pop(S);
if(m10) printf("%d",m); /*小于10,输出数字*/
else printf("%c", m+55); /*大于或等于10,输出相应的字符*/
}
printf("\n");
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流